Eloquent:find()和where()用法laravel

Awa*_*ine 24 php eloquent laravel-5.3

我试图从posts数据库表中使用其id 获取记录.我已经在find()方法上敲打了很长一段时间,现在很困惑,为什么它不起作用.这是我的查询,看起来对我来说是正确的但是没有用:

$post = Post::find($id);
$post->delete();
Run Code Online (Sandbox Code Playgroud)

我不情愿地这样做了:

$post = Post::where('id', $id);
$post->delete();
Run Code Online (Sandbox Code Playgroud)

而且令人惊讶的是,它有效,但我不知道如何.

我也知道,不像find(), where()是一个查询生成器,所以我也可以使用这样的: Post::where('id', $id)->first()

有关方法工作方式差异的任何想法?

cra*_*g_h 32

您的代码看起来很好,但有几件事需要注意:

Post::find($id);如果您已将模型中的主键设置为以下内容,则会对主键id执行操作:

protected  $primaryKey = 'slug';
Run Code Online (Sandbox Code Playgroud)

然后find将通过该键搜索.

Laravel还希望它id是一个整数,如果你使用的不是整数(如字符串),你需要将模型的递增属性设置为false:

public $incrementing = false;
Run Code Online (Sandbox Code Playgroud)

  • 但是在执行删除过程方面存在主要差异。如果使用模型实例删除$ post-> delete(),则会运行两个查询。一种是使用find()方法从数据库中检索记录,另一种是删除记录。使用查询生成器时,仅执行一个查询,永远不会创建模型实例。结果,Post模型上的任何功能都将无法使用。例如,如果您有模型删除事件侦听器,则将不会执行该模型。 (3认同)

小智 13

未找到异常

有时,如果找不到模型,您可能希望抛出异常。这在路由或控制器中特别有用。该findOrFailfirstOrFail方法将检索查询的第一个结果。但是,如果未找到结果,Illuminate\Database\Eloquent\ModelNotFoundException则会抛出 a:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();
Run Code Online (Sandbox Code Playgroud)

如果未捕获到异常,则会自动向用户发送 404 HTTP 响应。使用这些方法时,没有必要编写显式检查来返回 404 响应:

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
});
Run Code Online (Sandbox Code Playgroud)


Sly*_*ave 11

要添加上面的craig_h评论(我目前没有足够的代表将其添加为对他的答案的评论,抱歉),如果您的主键不是整数,您还需要告诉您的模型它是什么数据类型是,通过在模型定义的顶部设置keyType.

public $keyType = 'string'
Run Code Online (Sandbox Code Playgroud)

Eloquent理解castAttribute()函数中定义的任何类型,从Laravel 5.4开始,它们是:int,float,string,bool,object,array,collection,date和timestamp.

这将确保您的主键正确地转换为等效的PHP数据类型.