Laravel中firstOrFail()方法的行为及ID设置疑问
嘿,我来帮你把这两个写法的区别和ID设置的逻辑理清楚哈!
Laravel中
firstOrFail()的ID设置与写法差异 两种写法的核心区别
无参数的
firstOrFail():
你写的$channel = \App\Model\Channel::firstOrFail();这种写法,完全不需要指定ID。它的作用是直接查询channels数据表中的第一条记录(默认按主键id升序排序,也就是ID最小的那条),如果数据表是空的,就会抛出ModelNotFoundException异常。带ID的查询写法(你提到的
firstOrFail($id)其实是混淆了方法):
实际上Laravel的firstOrFail()方法本身并不直接接收ID作为参数,你说的这种写法应该是把findOrFail($id)和它搞混啦。如果要根据指定ID查询,正确的写法有两种:// 方式1:用where指定ID后调用firstOrFail $channel = \App\Model\Channel::where('id', $id)->firstOrFail(); // 方式2:更简洁的findOrFail(专门针对主键查询) $channel = \App\Model\Channel::findOrFail($id);这两种写法都是根据你传入的
$id值,去匹配数据表中对应主键ID的记录,要是找不到符合条件的记录,同样会抛出异常。
怎么设置/指定ID进行查询?
如果你想获取特定ID的Channel模型,推荐用这两种方式:
- 用
findOrFail($id):这是Laravel提供的快捷方法,专门用来根据主键(默认是id字段)查询模型,直接把你要找的ID值作为参数传进去就行。 - 结合
where()和firstOrFail():如果你的模型主键不是默认的id,或者你需要根据其他字段查询,就可以先用where()指定查询条件,再调用firstOrFail(),比如:// 假设主键字段是channel_id $channel = \App\Model\Channel::where('channel_id', $id)->firstOrFail();
最后再划个重点
firstOrFail()无参数:查询表中第一条记录,无需指定ID,空表时抛异常。findOrFail($id):根据主键ID查询指定记录,找不到时抛异常。where('id', $id)->firstOrFail():和findOrFail()效果一致,但更灵活,支持非主键字段的条件查询。
内容的提问来源于stack exchange,提问作者Jenski
相关产品推荐
相关产品推荐

