在哪里查询后,在Laravel 5.4中无法正常工作

时间:2017-06-16 06:57:59

标签: php laravel laravel-5 eloquent

在我的情况下,我有频道表,与类别表有很多关系。

我想获取其类别包含动态值的频道,例如对每个类别的标题进行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'时,它返回频道的类别我想要!

我使用错误的语法吗?是否真的同时使用wherewhereHas条款?

更新

我需要对频道的标题或用户名进行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不是我的问题。

4 个答案:

答案 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]]);
                })