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

时间:2016-11-21 16:53:31

标签: php eloquent laravel-5.3

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

$post = Post::find($id);
$post->delete();

我不情愿地这样做了:

$post = Post::where('id', $id);
$post->delete();

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

我也知道,与find()不同,where()是一个查询构建器,因此我也可以像这样使用它: Post::where('id', $id)->first()

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

3 个答案:

答案 0 :(得分:25)

您的代码看起来不错,但有几点需要注意:

如果您已将模型中的主键设置为Post::find($id);之外的其他内容,则

id会对主键执行操作:

protected  $primaryKey = 'slug';

然后find会搜索该密钥。

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

public $incrementing = false;

答案 1 :(得分:7)

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

public $keyType = 'string'

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

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

答案 2 :(得分:1)

未发现异常

有时候,如果找不到模型,您可能希望抛出异常。这在路由或控制器中特别有用。 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);
});