Laravel - 通过自定义列查找或失败

Posted

技术标签:

【中文标题】Laravel - 通过自定义列查找或失败【英文标题】:Laravel - find by custom column or fail 【发布时间】:2015-05-26 14:30:16 【问题描述】:

findOrFail() 方法,如果没有找到会抛出 404,例如:

User::findOrFail(1);

如何通过自定义列找到实体或失败,如下所示:

Page::findBySlugOrFail('about');

【问题讨论】:

【参考方案1】:

试试这样:

Page::where('slug', '=', 'about')->firstOrFail();    
// or without the explicit '='
Page::where('slug', 'about')->firstOrFail();

【讨论】:

Page::where('about', 'data')->firstOrFail(); 这应该适用于相等运算符'=',无需明确说明 @Alupotha 你也可以Page::whereAbout('data')->firstOrFail(); 我们需要更多样例来了解模型之后的类似方法。有没有关于 laravel 的文章...任何知识库【参考方案2】:

更新: 我目前正在使用 Laravel 6.9.0,并且我确认 @jeff-puckett 是正确的。 Where 子句工作正常。这就是它在我的修补程序上的工作原理。

>>> \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() 方法,它基本上会尝试检索表的第一条记录并删除 where 子句。所以在 where 之前调用 firstOrFail。

Model::firstOrFail()->where('something', $value)

【讨论】:

嗯,我想你一定有其他问题。在 laravel v5.6.23 中,where 子句首先适用于我 是的!它可以工作,但不同之处在于,在此示例中查询数据库然后使用集合的 where 助手。我的意思是在数据库变成集合之前使用where 子句查询数据库。【参考方案3】:
## 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();

【讨论】:

【参考方案4】:

在我看来,当您将静态 find() 用于 eloquent 模型时,也许您可​​以定义函数 getRouteKeyName() 来显式获取您想要的列。

public function getRouteKeyName()
  return 'slug';

如果你坚持,你可以把它写成模型内部的静态函数

public  static function findBySlugOrFail($value)
  //get slug collection or return fail
  return Post::where('slug', '=', $value)->firstOrFail();

【讨论】:

【参考方案5】:

试试这样:

Page::where('slug', '=', 'about')->get()

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Laravel - 通过自定义列查找或失败的主要内容,如果未能解决你的问题,请参考以下文章

laravel 4 自定义命名密码列

如何在 Laravel 上获取具有自定义列名的特定列

Laravel:如何设置带有条件的自定义列?

Laravel:自定义 css 文件的 npm run dev 失败

从 Laravel 的 belongsToMany 关系中选择自定义列

Laravel 验证:存在附加列条件 - 自定义验证规则