【问题标题】:Nested Eager Loading Specific Columns嵌套急切加载特定列
【发布时间】:2020-04-08 18:29:32
【问题描述】:

当我这样做时

$category = NewsCategory::whereSlug($slug)->with('news.category:id,title,slug')->firstOrFail();

然后我有以下查询

select * from `news_categories` where `slug` = 'novinki' limit 1
select * from `news_posts` where `news_posts`.`category_id` in (2) and `news_posts`.`deleted_at` is null
select `id`, `title`, `slug` from `news_categories` where `news_categories`.`id` in (2)

但我也想在第一个新闻关系上加载特定列,如果我这样做会出错

$category = NewsCategory::whereSlug($slug)->with('news:id,title,image.category:id,title,slug')->firstOrFail();

获取此查询的正确方法是什么?

select * from `news_categories` where `slug` = 'novinki' limit 1
select `id`, `title`, `image` from `news_posts` where `news_posts`.`category_id` in (2) and `news_posts`.`deleted_at` is null
select `id`, `title`, `slug` from `news_categories` where `news_categories`.`id` in (2)```

【问题讨论】:

    标签: laravel eloquent eager-loading


    【解决方案1】:

    我会将预先加载的关系放入一个数组中

    试试这个:

    $category = NewsCategory::whereSlug($slug)
                  ->with([
                      'news:id,title,image,category_id,deleted_at',
                      'news.category:id,title,slug'
                  ])->firstOrFail();
    

    或者根据我的个人喜好,使用闭包来扩展查询,如下所示:

    $category = NewsCategory::whereSlug($slug)
                  ->with([
                      'news' => function($query){
                          $query->select('id','title','image','category_id','deleted_at');
                       },
                      'news.category' => function($query){
                          $query->select('id','title','slug');
                       }
                  ])->firstOrFail();
    

    【讨论】:

    • 使用闭包很容易进行 where 查询 'news' => function($query){ $query->select('title','slug','category_id','image','fulltext','created_at')->whereIsPublished(true); }, 'news.category' => function($query){ $query->select('id','title','slug'); } 是否可以使用数组?像那样'news:id,title,image,category_id,deleted_at,is_published=true',
    • 我不认为这是可能的,但不太确定,因为我个人大部分时间都使用闭包。您应该将其作为一个新问题提出,以便其他人也可以尝试回答:)
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2018-07-28
    • 2020-01-13
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多