Laravel - 按自定义列查找或失败
Laravel - find by custom column or fail
有 findOrFail()
方法,如果没有找到则抛出 404,例如:
User::findOrFail(1);
如何通过自定义列查找实体或失败,如下所示:
Page::findBySlugOrFail('about');
这样试试:
Page::where('slug', '=', 'about')->firstOrFail();
// or without the explicit '='
Page::where('slug', 'about')->firstOrFail();
更新:
我目前正在使用 Laravel 6.9.0 并且我确认 @jeff-puckett 是正确的。 Where 子句工作正常。这就是它在我的 tinker 上的工作方式。
>>> \App\Models\User::findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> App\Models\User
id: "123b5545-5adc-4c59-9a27-00d035c1d212",
name: "John",
surname: "Graham",
email: "john.graham@test.com",
email_verified_at: "2020-01-03 16:01:53",
created_at: "2020-01-03 16:01:59",
updated_at: "2020-01-03 16:01:59",
deleted_at: null,
>>> \App\Models\User::where('name', 'Buraco')->findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> Illuminate/Database/Eloquent/ModelNotFoundException with message 'No query results for model [App/Models/User] 123b5545-5adc-4c59-9a27-00d035c1d212'
>>> \App\Models\User::where('name', 'John')->findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> App\Models\User
id: "123b5545-5adc-4c59-9a27-00d035c1d212",
name: "John",
surname: "Graham",
email: "john.graham@test.com",
email_verified_at: "2020-01-03 16:01:53",
created_at: "2020-01-03 16:01:59",
updated_at: "2020-01-03 16:01:59",
deleted_at: null,
过期:
至少花了两个小时才意识到,如果在 Laravel 5.6 中的 where() 之后链接 firstOrFail() 方法,它基本上会尝试检索 [=25] 的第一条记录=] 并删除 where 子句。所以在where之前调用firstOrFail。
Model::firstOrFail()->where('something', $value)
在我看来,当您对 eloquent 模型使用静态 find() 时,也许您可以定义函数 getRouteKeyName() 以显式获取您想要的列。
public function getRouteKeyName(){
return 'slug';
}
如果你坚持,你可以把它写成模型内部的静态函数
public static function findBySlugOrFail($value){
//get slug collection or return fail
return Post::where('slug', '=', $value)->firstOrFail();
}
## Or Via Scope For Multiple Rows ##
public function scopeGetOrFail ($query)
{
if (empty($query->count())) {
abort(404);
} else {
return $query->get();
}
}
Page::whereSlug('about')->getOrFail();
Page::where("slug","about")->getOrFail();
这样试试:
Page::where('slug', '=', 'about')->get()
有 findOrFail()
方法,如果没有找到则抛出 404,例如:
User::findOrFail(1);
如何通过自定义列查找实体或失败,如下所示:
Page::findBySlugOrFail('about');
这样试试:
Page::where('slug', '=', 'about')->firstOrFail();
// or without the explicit '='
Page::where('slug', 'about')->firstOrFail();
更新: 我目前正在使用 Laravel 6.9.0 并且我确认 @jeff-puckett 是正确的。 Where 子句工作正常。这就是它在我的 tinker 上的工作方式。
>>> \App\Models\User::findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> App\Models\User
id: "123b5545-5adc-4c59-9a27-00d035c1d212",
name: "John",
surname: "Graham",
email: "john.graham@test.com",
email_verified_at: "2020-01-03 16:01:53",
created_at: "2020-01-03 16:01:59",
updated_at: "2020-01-03 16:01:59",
deleted_at: null,
>>> \App\Models\User::where('name', 'Buraco')->findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> Illuminate/Database/Eloquent/ModelNotFoundException with message 'No query results for model [App/Models/User] 123b5545-5adc-4c59-9a27-00d035c1d212'
>>> \App\Models\User::where('name', 'John')->findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> App\Models\User
id: "123b5545-5adc-4c59-9a27-00d035c1d212",
name: "John",
surname: "Graham",
email: "john.graham@test.com",
email_verified_at: "2020-01-03 16:01:53",
created_at: "2020-01-03 16:01:59",
updated_at: "2020-01-03 16:01:59",
deleted_at: null,
过期:
至少花了两个小时才意识到,如果在 Laravel 5.6 中的 where() 之后链接 firstOrFail() 方法,它基本上会尝试检索 [=25] 的第一条记录=] 并删除 where 子句。所以在where之前调用firstOrFail。
Model::firstOrFail()->where('something', $value)
在我看来,当您对 eloquent 模型使用静态 find() 时,也许您可以定义函数 getRouteKeyName() 以显式获取您想要的列。
public function getRouteKeyName(){
return 'slug';
}
如果你坚持,你可以把它写成模型内部的静态函数
public static function findBySlugOrFail($value){
//get slug collection or return fail
return Post::where('slug', '=', $value)->firstOrFail();
}
## Or Via Scope For Multiple Rows ##
public function scopeGetOrFail ($query)
{
if (empty($query->count())) {
abort(404);
} else {
return $query->get();
}
}
Page::whereSlug('about')->getOrFail();
Page::where("slug","about")->getOrFail();
这样试试:
Page::where('slug', '=', 'about')->get()