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】:

未找到异常

有时,如果找不到模型,您可能希望抛出异常。这在路由或控制器中特别有用。 findOrFailfirstOrFail 方法将检索查询的第一个结果。但是,如果没有找到结果,则会抛出一个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() 不起作用

Laravel Eloquent Model :: find不起作用

Laravel Eloquent发现并返回两种不同的类型?

Eloquent ORM ->where 和 ->save

使用 Where 和 Eloquent 获取数据库结果