我很难将此查询转换为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
答案 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%')
});
答案 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的更多信息。