【问题标题】:Eloquent `with()` with filtering based on relation基于关系过滤的雄辩的`with()`
【发布时间】:2020-09-29 19:52:22
【问题描述】:

我有这张桌子。

这个模型关系,这个关系很好。

class Item extends Model
{

    public function translations()
    {
        return $this->hasMany(ItemTranslations::class);
    }
}
class ItemTranslation extends Model
{

    public function language()
    {
        return $this->belongsTo(Language::class);
    }
}

我需要返回带有翻译的项目列表,但只返回与特定语言相关的翻译。

我不能让这个查询工作,我得到每个项目的所有翻译,而不仅仅是用这个查询过滤的那个。结果不需要与翻译相关的语言。

$query = Item::query();

$query->with('translations')->when('language',function($query) use ($ISOlanguage) {
    return $query->where('languages.ISO_code', '=', $ISOlanguage);
});

return $query->paginate();

知道我可以让谁工作吗?谢谢!

【问题讨论】:

    标签: laravel eloquent eager-loading


    【解决方案1】:

    所以你想要做的是限制急切加载

    Item::with(["translations" => function ($query) use ($ISOlanguage) {
        $query->where('language.ISO_code', $ISOlanguage);
    }])->get();
    

    https://laravel.com/docs/5.8/eloquent-relationships#constraining-eager-loads

    【讨论】:

    • 列出所有(或部分)项目时,还希望加载翻译,但只加载与特定语言相关的翻译
    • 在我的示例中,您加载了所有translations,其中languages ISO_code 等于您的$ISOlanguage:或者您的意思是什么?
    • 感谢您的回复,由于某些原因无法正常工作,我用整个查询更新了我的问题。我收到此错误:``` 未定义表:7 错误:缺少表“语言”第 1 行的 FROM 子句条目:...item_translations"."language_id" in (1, 2) 和 "language... ^ ( SQL: select * from "item_translations" where "item_translations"."language_id" in (1, 2) and "language"."ISO_code" = EN) ``
    • 即使我使用languages 这是真正的表名,我也会遇到同样的问题
    • 如果没有querypaginate,它是否适用于我在问题中的示例?如果是这样,您可以使用我的示例并将get() 替换为paginate()
    【解决方案2】:

    终于搞定了

    Item::with(['translations' => function($query) use ($ISOlanguage) {
       $query->whereHas('language', function($query) use ($ISOlanguage) {
           $query->where('ISO_code', '=', $ISOlanguage);
       });
    }])->get();
    

    感谢@julian-s 的帮助!

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多