Eloquent:find() 和 where() 用法 laravel
Posted
技术标签:
【中文标题】Eloquent:find() 和 where() 用法 laravel【英文标题】:Eloquent: find() and where() usage laravel 【发布时间】:2017-04-05 03:41:48 【问题描述】:我正在尝试使用其 ID 从 posts
数据库表中获取记录。一段时间以来,我一直在研究 find() 方法,对它为什么不起作用感到困惑。这是我的查询,对我来说看起来正确但不起作用:
$post = Post::find($id);
$post->delete();
我不情愿地这样做了:
$post = Post::where('id', $id);
$post->delete();
令人惊讶的是,它确实有效,但我不知道如何。
我也知道,与find()
不同,where()
是一个查询生成器,所以我也可以这样使用它:
Post::where('id', $id)->first()
对这些方法的工作方式有什么不同的想法吗?
【问题讨论】:
【参考方案1】:您的代码看起来不错,但有几点需要注意:
Post::find($id);
作用于主键,如果您已将模型中的主键设置为 id
以外的其他值:
protected $primaryKey = 'slug';
然后find
将改为按该键搜索。
Laravel 还期望 id
是一个整数,如果您使用的不是整数(例如字符串),则需要将模型上的递增属性设置为 false:
public $incrementing = false;
【讨论】:
尽管删除过程的执行存在重大差异。如果您使用模型实例进行删除,即 $post->delete(),则会运行两个查询。一种是使用 find() 方法从数据库中检索记录,另一种是删除记录。使用查询生成器时,只执行一个查询,永远不会创建模型实例。因此,Post 模型上的任何功能都将不起作用。例如,如果你有一个模型删除事件监听器,它将不会被执行。 Ahmed 的答案应该突出显示,因为差异会引起很多混乱。 并且可以使用这个。 User::find($obj) 其中obj的id为外键,命名为user_id(表名加“_id”)【参考方案2】:要添加到上面 craig_h 的评论(我目前没有足够的代表将此作为评论添加到他的答案中,抱歉),如果您的主键不是整数,您还需要告诉您的模型什么数据类型,通过在模型定义的顶部设置 keyType。
public $keyType = 'string'
Eloquent 可以理解 castAttribute()
函数中定义的任何类型,从 Laravel 5.4 开始,这些类型包括:int、float、string、bool、object、array、collection、date 和 timestamp。
这将确保您的主键正确转换为等效的 php 数据类型。
【讨论】:
【参考方案3】:未找到异常
有时,如果找不到模型,您可能希望抛出异常。这在路由或控制器中特别有用。 findOrFail
和 firstOrFail
方法将检索查询的第一个结果。但是,如果没有找到结果,则会抛出一个Illuminate\Database\Eloquent\ModelNotFoundException
:
$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();
如果未捕获到异常,则会自动将 404 HTTP 响应发送回用户。使用这些方法时,无需编写显式检查以返回 404 响应:
Route::get('/api/flights/id', function ($id)
return App\Flight::findOrFail($id);
);
【讨论】:
以上是关于Eloquent:find() 和 where() 用法 laravel的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 关系 findMany 或 find
Laravel 4:Eloquent::find() 不起作用