Laravel 5 Eloquent中的高级嵌套AND子句

时间:2015-05-31 05:20:16

标签: laravel eloquent laravel-5

我很难将此查询转换为laravel eloquent,任何帮助都将受到赞赏。

我需要运行的查询是

SELECT * FROM `articles` WHERE `articles`.`deleted_at` IS NULL AND `id` <> 2 AND (`tags` LIKE '%tag1%' OR `tags` LIKE '%tag2%')

这就是我现在所拥有的

$relatedArticles = Article::where('id', '<>', $article->id);
if (!is_null($article->tags)) {
    foreach (explode(',', $article->tags) as $tag) {

        $relatedArticles = $relatedArticles->orWhere('tags', 'LIKE', '%' . $tag . '%');
    }
}
$relatedArticles = $relatedArticles->get();

但上面的代码让我产生了

SELECT * FROM `articles` WHERE `articles`.`deleted_at` IS NULL AND `id` <> 2 OR `tags` LIKE '%tag1%' OR `tags` LIKE '%tag2%'

这不是我要找的。

由于

关心 GAGAN

3 个答案:

答案 0 :(得分:1)

你应该使用&#34; advanced where&#34;。您可以使用函数向where提供列,而不是列名。为了更加清晰,请在此处查看http://laravel.com/docs/5.0/queries#advanced-wheres。您的代码应如下所示:

$relatedArticles = Article::where('id', '<>', $article->id);

if (!is_null($article->tags)) {
    $relatedArticles->where(function($query) use ($article) {
        foreach (explode(',', $article->tags) as $tag) {
            $query->orWhere('tags', 'LIKE', '%' . $tag . '%');
        }
    });
}

$relatedArticles = $relatedArticles->get();

P.S。如果您想知道use是什么,PHP上的匿名函数与JavaScript不同,您需要指定在函数上可见的变量。

答案 1 :(得分:0)

嗯,使用Query Builder语法在Laravel查询中转换该SQL很容易。

会是这样的:

$relatedArticles = Article::where('id', '<>', $article->id)
                            ->where(function($query)
                                   {
                                        $query->where(`tags`, 'like', '%tag1%')
                                              ->orWhere(`tags`, 'like', '%tag2%')
                                   });

有关详情:Laravel Advanced Wheres

答案 2 :(得分:0)

试试这个:

$relatedArticles = Article::where('id', '<>', $article->id);

if (!is_null($article->tags)) {
    $relatedArticles->where(function($query) use ($article)
    {
        foreach (explode(',', $article->tags) as $tag) {
            $query->orWhere('tags', 'LIKE', '%' . $tag . '%');
        }
    });
}

$relatedArticles->get();

有关advanced wheres的更多信息。