我是拉雷维尔的新手,我需要构建一个复杂的查询.我设法对它进行了排序,但当用户要求多个标签(tags = 1, 2, 3
)时除外.显示的产品必须包含用户要求的所有tags
项(不仅仅是一项或两项,而是全部).
我用SQL查询(这个示例是两个标记,我会根据传递的标记数将其切换为不同的数字):
SELECT m.*
FROM meals m
WHERE EXISTS (
SELECT 1
FROM meals_tags t
WHERE m.id = t.meals_id AND
t.tags_id IN (227,25)
HAVING COUNT(1) = 2
);
这个方法工作得很好,但我在将其转换为一个Eloquent 的查询生成器where
方法时遇到了一个问题.
我在同一个查询中包含了另外where
个方法,所以我也想附加这个方法.
我试过这个:
DB::table('meals')
->select('id')
->where(function ($query) use ($parameters) {
if (isset($parameters['tags'])) {
$array = explode(',', $parameters['tags']);
$query->select(DB::raw(1))
->from('meals_tags')
->where('meals.id', '=', 'meals_tags.meals_id')
->whereIn('meals_tags.tags_id', $array)
->having(DB::raw('COUNT(1)'), '=', count($parameters['tags']));
}
});
但我找不到办法.Laravel和PHP新手.
假设我有表meals
和tags
以及meals_tags
来连接它们(多对多).
$paramaters
来自GET (...?tags=1,2,3&lang=en&another=something...)
,它们是键值对数组(['tags' => '1,2,3', 'lang' => 'en']
)
$parameters['tags']
是string
型,带有逗号分隔的数字(正数integers
大于0
),因此如果需要,我可以 Select 在某处分解它.