带有 Join 和 If 条件的 Laravel 查询生成器

Posted

技术标签:

【中文标题】带有 Join 和 If 条件的 Laravel 查询生成器【英文标题】:Laravel Query Builder with Join and If condition 【发布时间】:2021-07-25 06:56:51 【问题描述】:

如何在查询生成器的结果中使用 if else 条件?

$data = DB::table('peminjaman')
                        ->select('peminjaman.id as id_peminjaman',
                                'reads.pageread',
                                'books.*',
                                'pengarang.name as pengarang_name'
                                )
                        ->join('reads','reads.id_book','peminjaman.id_book')
                        ->join('books','books.id','=','reads.id_book')
                        ->join('pengarang','pengarang.id','=','books.idpengarang')
                        ->where('peminjaman.id_user',$user->id)
                        ->orderBy($sort,$urut)
                        ->get();
   

我想使用一些这样的条件,在实际情况下会有很多其他的地方,以及用于我上面声明连接的地方的表

  if($statment=="notread")
            where('reads.pageread', '=',0);
        
        if($statment=="read")
            where('reads.pageread', '=',1);
        
        if($statment=="bigbook")
            where('books.bigbook', '=',1);
              

  

【问题讨论】:

那么您的意思是根据条件添加->where 吗? 【参考方案1】:

你可以像这样使用 laravel 的条件子句 'when' :

这是一个示例代码,正如您所说,可以有很多 where 子句。您可以根据需要使用它

$test = 2;    
DB::table('users')->when(($test==2),function ($query)
            return $query->where('id',2);
        )->get();

【讨论】:

【参考方案2】:

只需复制粘贴您的查询并进行一些修饰,结果如下。只需改进您的查询构建器,以防您想让它更复杂

$data = DB::table('peminjaman')
->select(
         'peminjaman.id as id_peminjaman',
         'reads.pageread',
         'books.*',
         'pengarang.name as pengarang_name'
        )
->join('reads', 'reads.id_book', '=', 'peminjaman.id_book')
->join('books', 'books.id', '=', 'reads.id_book')
->join('pengarang', 'pengarang.id', '=', 'books.idpengarang')
->where('peminjaman.id_user', $user->id)
->when($statement, function($query, $statement)
      if($statement === 'notread')
            return $query->where('reads.pageread', 0);
       elseif($statement === 'read')
            return $query->where('reads.pageread', 1);
       elseif($statment=="bigbook")
            return $query->where('books.bigbook', 1);
      
)
->orderBy($sort, $urut)
->get();

【讨论】:

我尝试了帽子,但我在行中遇到错误 ->orderBy 告诉我你的错误,我不是知道错误的向导 现在已经完成了,只需要")" in up ->orderBy so ) 谢谢,我在上面编辑了我的代码,以防有人想复制我的代码块 只需在function()后面加上use($user)

以上是关于带有 Join 和 If 条件的 Laravel 查询生成器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel ORM 怎么在条件语句中做本表的一个字段和关联表的字段做比较?

laravel eloquent JOIN ON 多个条件

刀片视图:带有 OR/AND 条件的 if 语句

Laravel Left Join 条件为 ON

laravel 查询:orWhere:双重条件

带有 WHERE 条件和 INNER JOIN 的 SELECT 命令