在我的情况下,我有频道表,与类别表有很多关系。
我想获取其类别包含动态值的频道,例如对每个类别的标题进行LIKE
查询。但是我需要通过where子句检查 channel 的其他列。
这是一个频道结构:
[
{
"id": 87,
"username": "ch1",
"title": "ch title",
"type": "channel",
"members": 210424,
"location": "tabriz",
"created_at": "2017-05-09 01:39:44",
"updated_at": "2017-05-16 17:19:28",
}
]
为了得到我想要的东西,我运行这个查询:
$channels = Channel::orderBy('members', 'desc')
->whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})
->where([
['visible', 1],
['title', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->get();
上层查询返回所有频道,就像没有whereHas
子句的查询一样,而当我单独使用'whereHas'时,它返回频道的类别我想要!
我使用错误的语法吗?是否真的同时使用where
和whereHas
条款?
更新
我需要对频道的标题或用户名进行like
查询,因此我使用orWhere
但结果与以前一样!它将所有频道返回给我!比如没有whereHas
的查询。
所以我使用这个查询来做到这一点,
$channels = Channel::orderBy('members', 'desc')
->whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})
->where([
['visible', 1],
['title', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->orWhere([
['visible', 1],
['username', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->get();
起初我认为问题是@Beprator所说的orderBy子句,但在添加orWhere
之后我明白orderBy
不是我的问题。
答案 0 :(得分:1)
Channel::whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})->orderBy('members', 'desc')
在order_by
之前使用whereHas->orWhere(function ($query) {
$query->where('visible', '=', 1)
->where('username', 'LIKE', '%' . $trend . '%')
->where('location', 'LIKE', '%' . $location . '%')
->where('members', '>', $members);
})
答案 1 :(得分:1)
尝试在->whereHas()
之后使用->where()
。您无需正常复制任何内容。
$channels = Channel::where([
['visible', 1],
['title', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->orWhere([
['visible', 1],
['username', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})
->orderBy('members', 'desc')
->get();
答案 2 :(得分:0)
我通过在whereHas
之后复制orWhere
子句来解决此问题。
因此,为了获取我想要的类别的频道,我使用了这个查询:
$channels = Channel::orderBy('members', 'desc')
->whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})
->where([
['visible', 1],
['title', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->orWhere([
['visible', 1],
['username', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})
->get();
也许这很奇怪,但工作得很好!
答案 3 :(得分:0)
whereHas()
与where()
和orWhere()
错误使用。在whereHas
之后,第二个条件和第三个条件必须在子例程中组合。当前,您的查询将如下所示:
SELECT * FROM foo WHERE something_where_has 1 AND WHERE something 2 OR WHERE something 3 ..
但是我认为您想要的是这样的条件:
SELECT * FROM foo WHERE something_where_has 1 AND (WHERE something 2 OR WHERE something 3) ..
所以这可能为您服务:
->whereHas('categories', function ($query) use ($category) {
$query->where('title', 'LIKE', '%' . $category . '%');
})
->where(function($q) {
$q->where([
['visible', 1],
['title', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]])
->orWhere([
['visible', 1],
['username', 'LIKE', '%' . $trend . '%'],
['location', 'LIKE', '%' . $location . '%'],
['members', '>', $members]]);
})