【问题标题】:Returning the first model from a hasMany relationship in Laravel从 Laravel 中的 hasMany 关系返回第一个模型
【发布时间】:2017-11-15 10:22:17
【问题描述】:

是否可以创建一个快速的方法来从一对多关系中返回第一个模型?这是我的代码,来自模型文件:

public function books() {
    return $this->hasMany('App\Models\Book');
}

public function first_book() {
    return $this->book()->first();
}

这是我得到的错误:

Call to undefined method Illuminate\Database\Query\Builder::addEagerConstraints()

之所以要使用这个,是为了可以使用with()方法收集第一条记录,例如:

$authors = Author::with('first_book')->select('*');

我将这些记录与数据表一起使用。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    要使用with(),您的方法必须从关系方法返回一个集合,因为您的关系是hasMany。所以你可以做的是:

    public function books() {
        return $this->hasMany('App\Models\Book');
    }
    
    public function first_book() {
        return $this->hasMany('App\Models\Book')->limit(1);
    }
    

    这将返回一个包含您的第一个项目的集合,因此您仍然需要致电 first()

    $authors = Author::with('first_book')->select('*');
    $authors->first_book->first();
    

    【讨论】:

    • 我会替换 return $this->hasMany('App\Models\Book')->limit(1); with return $this->books()->limit(1);
    • 是否可以从特定索引位置返回值?例如,像这样..... $row->sub_category[0]->name
    • @RoshJ 取决于sub_category 是什么,如果它是一个集合,那么是的,您可以致电$row->sub_category->get(0)->name
    • 是的,子类别是一个数组,但这不起作用,我试过:(
    • 这不起作用,它只返回第一作者的1个数据,但不返回第二作者的数据。
    【解决方案2】:

    可以预先加载的关系必须返回一个查询。 first() 函数返回一个雄辩的对象。

    解决办法是限制这个查询的结果数,如下:

    public function first_book() {
        return $this->books()->take(1);
    }
    

    $author->first_book 仍将是一个集合,但它只会包含您数据库中的第一本相关书籍。

    【讨论】:

    • 这个答案是错误的,如果你调试 eloquent 执行的 sql 语句,你会发现当你使用 'with' 方法时,你只会得到所有集合的最后一个元素,因为拍摄(1)。
    【解决方案3】:

    一对一的关系是一种非常基本的关系。例如

    public function books()
        {
            return $this->hasOne('App\Models\Book');
        }
    

    【讨论】:

    • 如果您希望它返回一个对象而不是数组,这是最好的解决方案。如果你使用take(1),如上所示,那么你最终将不得不总是运行first()[0] 来获取你想要的数据。
    • 很好的解决方案,我们也可以将查询条件链接起来得到想要的记录。
    • 只有这样才能调用关系 - 书
    【解决方案4】:

    我可能会迟到,但为了您将来的使用以及想要相同输出的其他人试试这个 -

    //如果需要最后一个

    public function books() {
        return $this->hasOne('App\Models\Book')->latest();
    }
    

    //如果需要第一个条目-

    public function books() {
            return $this->hasOne('App\Models\Book')->oldest();
        }
    

    【讨论】:

    • 按ID排序吧?如何从 where 和自定义 orderBy 获取?
    • 在我的例子中,调试栏显示所有相关模型都被水合了,即使关系是 hasOne。添加 take(1) 显着减少了内存负载并显着减少了请求持续时间
    • 这不会返回 1 个数据,它会返回所有数据。
    • @JenuelGanawed 你能分享你的代码吗?您在那里有 hasOne 关系,它应该返回一条记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2018-07-21
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2014-12-22
    • 2019-11-27
    相关资源
    最近更新 更多