Laravel 5.1查询构建器,带有'in'子句,带有多个嵌套OR查询

时间:2016-03-02 02:57:21

标签: php mysql laravel

我想把这个sql转换成php laravel 5.1查询。

SELECT `videoId`, `videoTitle`FROM `tempdetails` WHERE `videoTitle` LIKE '%Ramsays Kitchen Nightmares%' 
or videoTitle in
(
videoTitle in 
(`videoTitle` LIKE '%season 1%' or `videoTitle` LIKE '%e01%' or `videoTitle` LIKE '%01x%')
or
videoTitle in
(`videoTitle` LIKE '%episode 1%' or `videoTitle` LIKE '%s01%' or `videoTitle` LIKE '%x01%') 
)

这是我试过的代码。

  $vd = DB::table('tempdetails');
               $vd ->where('videoTitle', 'like', '%'.$titl.'%')
               ->whereIn('videoTitle',function($query) {
                 $query->orwhere( 'videoTitle', 'like', '%season 1%')
                 ->orWhere( 'videoTitle', 'like', '%s01%')
                 ->orWhere( 'videoTitle', 'like', '%01x%');
               });
               $vd->whereIn('videoTitle',function($query) {
                 $query->orWhere( 'videoTitle', 'like', '%episode 1%')
                 ->orWhere( 'videoTitle', 'like', '%e01%')
               ->orWhere( 'videoTitle', 'like', '%x01%');
             });
            $vd->get();

但这给了我一个错误:

  

SQLSTATE [HY000]:常规错误:1096未使用任何表(SQL:select *   来自tempdetails,其中videoTitle喜欢%Ramsay的厨房   梦魇%和videoTitle in(选择* videoTitle喜欢   %季节1%或videoTitle喜欢%s01%或videoTitle喜欢%01x%)和   videoTitle in(select * where videoTitle喜欢%episode 1%或   videoTitle例如%e01%或videoTitle例如%x01%))

任何人都知道如何实现这个目标?

1 个答案:

答案 0 :(得分:0)

您可以使用whereRawDB::select()。当我的复杂语句不能直观地翻译时,除非我真的需要雄辩,否则我更喜欢运行原始语句。

此外,我不确定您的数据是什么样的以及您想要实现的目标,但可能有一种方法可以重写您的查询,以便更好地了解雄辩的约束。

whereRaw()

的示例
$wherelikes = "videoTitle in
(
videoTitle in 
(`videoTitle` LIKE '%season 1%' or `videoTitle` LIKE '%e01%' or `videoTitle` LIKE '%01x%')
or
videoTitle in
(`videoTitle` LIKE '%episode 1%' or `videoTitle` LIKE '%s01%' or `videoTitle` LIKE '%x01%') 
)"
$vd = DB::table('tempdetails')
          ->whereRaw("`videoTitle` LIKE '%Ramsays Kitchen Nightmares%'")
          ->orWhere(function($query) use ($whereLikes) {
            $query->whereRaw($whereLikes)
           })->get();

DB::select()

的示例
$statement = "SELECT `videoId`, `videoTitle`FROM `tempdetails` WHERE `videoTitle` LIKE '%Ramsays Kitchen Nightmares%' 
or videoTitle in
(
videoTitle in 
(`videoTitle` LIKE '%season 1%' or `videoTitle` LIKE '%e01%' or `videoTitle` LIKE '%01x%')
or
videoTitle in
(`videoTitle` LIKE '%episode 1%' or `videoTitle` LIKE '%s01%' or `videoTitle` LIKE '%x01%') 
)"
$vd = DB::select(DB::raw($statement));