Laravel 雄辩与条件

Posted

技术标签:

【中文标题】Laravel 雄辩与条件【英文标题】:Laravel eloquent with and with condition 【发布时间】:2021-12-18 09:27:44 【问题描述】:

我正在尝试从类别中获取类别和选定项目。这是我的代码:

$reqItems = $request->items; //array - selected item
$categories = Category::where('type_id', 1)
     ->whereHas('items', function ($query) use ($reqItems)
         $query->whereIn('id', $reqItems);
     )
    ->with('items');
    ->get();

但这将返回所有项目,即使不是在选定项目中。

我尝试使用 foreach,它返回 null

$reqItems = $request->items; //array - selected item
$categories = Category::where('type_id', 1)->with('items');
foreach($reqItems as $reqItem) 
   $categories = $categories->whereHas('items', function ($query) use ($reqItem)
       $query->where('id', '=', $reqItem);
   );

$categories = $categories->get();

如何只返回选定的项目?

【问题讨论】:

您可以将用于whereHas 的相同闭包应用到with ...约束急切负载:laravel.com/docs/7.x/… 【参考方案1】:

正如@lagbox 所建议的,这里是工作代码:

$reqItems = $request->items;
$categories = Category::where('type_id', 1)
->with(['items' => function ($query) use ($reqItems)
        $query->whereIn('id', $reqItems);
    ])->get();

【讨论】:

【参考方案2】:

当您希望预先加载关系并为预先加载查询指定其他查询条件时。您可以通过将关系数组传递给 with 方法来完成此操作,其中数组键是关系名称,数组值是为急切加载查询添加额外约束的闭包:

  $categories = Category::where('type_id', 1)
        ->whereHas('items', function ($query) use ($reqItems)
            $query->whereIn('id', $reqItems);
        )
        ->with(['items'=>function ($query) use ($reqItems)
            $query->whereIn('id', $reqItems);
        ])
    ->get();

【讨论】:

返回错误:mb_strpos() 期望参数 1 是字符串,给定对象 是的,大括号中的错误,我已经更新了答案,请再试一次。

以上是关于Laravel 雄辩与条件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩的查询与条件下另一个表中的值的总和

Laravel 雄辩的 SQL 查询与 OR 和 AND 与 where 子句

laravel 雄辩的多个表 where 条件

Laravel 7 雄辩的嵌套条件,用于使用枢轴进行过滤

如何包装 Laravel 雄辩的条件来创建以下查询

Laravel 通过属性获得雄辩的查询构建器关系