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

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

User::findOrFail(1);

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

Page::findBySlugOrFail('about');

【问题讨论】:

    标签: laravel laravel-4 eloquent laravel-5


    【解决方案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
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 2014-08-25
        • 2014-10-02
        • 1970-01-01
        • 2018-06-18
        相关资源
        最近更新 更多