【问题标题】:Convert SQL to Eloquent Query Builder : Laravel5.5将 SQL 转换为 Eloquent 查询生成器:Laravel5.5
【发布时间】:2018-08-06 05:07:33
【问题描述】:

如何将此 SQL 转换为 Laravel5.5 Eloquent 格式

select * from 'arm_articles' where ('article_tag' like '%standard%' or 'article_topic' like '%standard%' or 'article_details' like '%standard%' or 'article_type' like '%standard%') and ( ('id' between 287 and 296) and 'article_active' = 1) order by 'id' desc

请注意 SQL 中的大括号

这是我写的,当我使用 ->toSql

测试输出时返回不同的 sql

$post= PostModel::where('article_tag','like','%'.$contributor_id.'%')->orWhere('article_topic','like','%'.$contributor_id.'%')->orWhere('article_details','like','%'.$contributor_id.'%')->orWhere('article_type','like','%'.$contributor_id.'%')->whereBetween('id', [$end, $start-1])->where('article_active',1)->orderBy('id', 'desc')->take(10)->get();

从上面的查询中找到 SQL 输出

select * from 'arm_articles' where 'article_tag' like ? or 'article_topic' like ? or 'article_details' like ? or 'article_type' like ? and 'id' between ? and ? and 'article_active' = ? order by 'id' desc limit 10

此输出看起来像所需的 SQL,但不同的是 SQL 上的大括号。所以一个硬币 Eloquent Query Builder 出来的查询括号?

【问题讨论】:

标签: php sql laravel laravel-5


【解决方案1】:

where() closure 用于parameter grouping

PostModel::where(function($q) use($contributor_id) {
        $q->where('article_tag', 'like', '%' . $contributor_id . '%')
          ->orWhere('article_topic', 'like', '%' . $contributor_id . '%')
          ->orWhere('article_details', 'like', '%' . $contributor_id . '%')
          ->orWhere('article_type', 'like', '%' . $contributor_id . '%');
    })
    ->whereBetween('id', [$end, $start - 1])
    ->where('article_active', 1)
    ->orderBy('id', 'desc')
    ->take(10)
    ->get();

【讨论】:

【解决方案2】:

试试这个

$post = PostModel::where(function ($query) use ($contributor_id) {              
          $query->orWhere('article_topic','like','%'.$contributor_id.'%')
          ->orWhere('article_details','like','%'.$contributor_id.'%')
          ->orWhere('article_type','like','%'.$contributor_id.'%')
          ->orwhere('article_tag','like','%'.$contributor_id.'%');
        })->whereBetween('id', [$end, $start-1])
        ->where('article_active',1)
        ->orderBy('id', 'desc')
        ->take(10)
        ->get();

Alexey Mezenin 在我之前就做到了。

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 2015-07-21
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2021-08-07
    • 2023-01-20
    相关资源
    最近更新 更多