【问题标题】:Can I manually eager load a model with data in Laravel Eloquent?我可以在 Laravel Eloquent 中手动预先加载带有数据的模型吗?
【发布时间】:2020-02-27 20:04:41
【问题描述】:

例如说我有 Book 和 Author 模型。我渴望像这样加载作者:

$books = Book::with('author')->get();

但我已经使用Author::all() 获取了作者列表,以便在页面的其他位置显示它们(用于过滤的选择字段)。所以现在 Laravel 执行了 3 个查询:

select * from authors;
select * from books;
select * from authors where id in (1, 2, 3, ...);

第三个查询显然是多余的,因为我已经有了作者。有什么方法可以将我的 $authors Collection 传递到我的 Book 查询中吗?通过文档和 API 搜索,找不到任何东西。

【问题讨论】:

  • 有趣的问题。我不熟悉任何规避查询构建器方法进行急切加载的方法。你也许可以反过来做:$authors = Author::with('books')->get(); 来获取作者,然后是$books = $authors->pluck('books')->unique();(或类似的)。将查询减少一个,但使用Collection 逻辑仍然效率很低。

标签: php laravel eloquent eager-loading


【解决方案1】:

您可以使用此自定义代码

$authors = Author::get();
$books = Book::get();

foreach ($books as $book) {
    $author = $authors->where('id', $book->author_id)->first();
    $book->setRelation('author', $author);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2016-02-20
    • 2015-12-14
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多