Laravel whereJsonContains在whereExists子查询中返回无结果

9rbhqvlz  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(184)

这是我当前的代码,执行时不会返回任何结果。(Query1)

// Get all product categories that has a relation
$product_categories = ProductCategory::whereExists(function($query) {
        $query->select('id')
            ->from('restaurants')
            ->whereJsonContains('restaurants.restaurant_categories', 'product_categories.name');
})->get();

// Log
dd($product_categories->toSql());

这里是sql查询转储

select *
from `product_categories`
where exists (
    select `id`
    from `restaurants`
    where json_contains(`restaurants`.`restaurant_categories`, ?)
)
and `product_categories`.`deleted_at` is null

而这在执行时将返回结果(Query2)

// Get all product categories that has a relation
$product_categories = ProductCategory::whereExists(function($query) {
        $query->select('id')
            ->from('restaurants')
            ->whereJsonContains('restaurants.restaurant_categories', 'Food');
})->get();

// Log
dd($product_categories->toSql());

下面也是一个sql查询转储

select *
from `product_categories`
where exists (
    select `id`
    from `restaurants`
    where json_contains(`restaurants`.`restaurant_categories`, ?)
)
and `product_categories`.`deleted_at` is null"

观察结果
1.两个sql转储是相同的
1.两个查询之间的区别在于 * whereJsonContains * 的第二个参数
1.在第一个查询中,我将表列传递给 * whereJsonContains * 方法
1.在第二个查询中,我直接传递行值

问题

1.如何使用列 * name * 上的行值过滤查询(使Query1工作)。
1.我错过了什么?

有关更多上下文,请参阅以下表格

表格:restaurants
| 身份证|姓名|餐厅_类别|
| - ------|- ------|- ------|
| 1个|花式|["食物"]|
表格:product_categories
| 身份证|姓名|类型|
| - ------|- ------|- ------|
| 1个|食物|易碎的|
这是我更新的代码,执行时不会返回结果。(Query3)

// Get all product categories that has a relation
$product_categories = ProductCategory::whereExists(function($query) {
        $query->select('id')
            ->from('restaurants')
            ->whereJsonContains('restaurants.restaurant_categories', \DB::raw('product_categories.name'));
})->get();

// Log
dd($product_categories->toSql());

下面是Query3的sql查询转储

select *
from `product_categories`
where exists (
    select `id`
    from `restaurants`
    where json_contains(`restaurants`.`restaurant_categories`, product_categories.name)
)
and `product_categories`.`deleted_at` is null"
vcudknz3

vcudknz31#

在这两种情况下,whereJsonContains()都试图匹配一个字符串字面值

whereJsonContains('restaurants.restaurant_categories', 'product_categories.name')

如果您的restaurants表如下所示,将给予结果。
| 身份证|姓名|餐厅_类别|
| - ------|- ------|- ------|
| 1个|花式|[“产品类别名称”]|
如果要尝试与列而不是字符串匹配,请尝试

whereJsonContains('restaurants.restaurant_categories', DB::raw('product_categories.name'))

相关问题