我是拉雷维尔的新手,我需要构建一个复杂的查询.我设法对它进行了排序,但当用户要求多个标签(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新手.

假设我有表mealstags以及meals_tags来连接它们(多对多).


$paramaters来自GET (...?tags=1,2,3&lang=en&another=something...),它们是键值对数组(['tags' => '1,2,3', 'lang' => 'en'])

$parameters['tags']string型,带有逗号分隔的数字(正数integers大于0),因此如果需要,我可以 Select 在某处分解它.

推荐答案

假设您已经在Meal模型上定义了belongsToMany(多对多)meal_tags关系,您可以try

Meal::select('id')
    ->when(
        $request->has('tags'),
        function($query) use ($request) {
            $requestedTagIds = explode(',', $request->tags);

            return $query->whereHas(
                'meal_tags', 
                fn ($query) => $query->whereIn('tags_id', $requestedTagIds),
                '=', 
                count($requestedTagIds)
            );
        }
    )
    ->get();

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

如何在产品查询中插入GROUP_CONCAT?

用于将重复行的唯一列值作为单独列获取的SQL查询

基于多行从表中 Select

从表中 Select 具有不同顺序的列

从 NextJS/Prisma 添加用户 ID (FK) 到 MySQL 表

将 GORM 与自定义连接表和外键结合使用

Group By 查询运行速度太慢而无法正常运行

如何编写按天数汇总值的sql查询?

计算MySQL中的连续出现

如何根据 R 中的价格范围将数据从一列复制到新列?

需要按总金额检索前 3 个供应商,每个类别 - 子类别

如何在 SQL 中计算留存曲线?

MySQL Join 查询位置从订单

更新和替换未加引号的 JSON 字符串

DECIMAL(m, n) 在 64 位系统中如何表示?

如何在 Mysql 中创建复合外键

MySQL - 如何 Select 值在数组中的行?

是否可以在 macOS 上只安装 mysqldump

PHP MySQLI 防止 SQL 注入