这是我当前的代码,执行时不会返回任何结果。(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"
1条答案
按热度按时间vcudknz31#
在这两种情况下,
whereJsonContains()
都试图匹配一个字符串字面值。如果您的
restaurants
表如下所示,将给予结果。| 身份证|姓名|餐厅_类别|
| - ------|- ------|- ------|
| 1个|花式|[“产品类别名称”]|
如果要尝试与列而不是字符串匹配,请尝试