Laravel orderByRaw正在从联合查询中删除结果

时间:2018-02-06 14:44:32

标签: php mysql laravel

我正在一个项目中运行此查询,我正在将“meta_competitions”和“primary_events”合并到一个结果中,它们不会与具有当前primary_event的primary_event_id的primary_event_meta_competition重叠。

在查询本身中,一切都按预期工作,我们得到了我们想要的结果。但是当我们添加orderByRaw()时,除了一个结果之外的所有内容都被删除了meta_competitions。

我已经尝试运行查询,当我运行“ - > toSql()”而不是 - > get()的纯sql中的查询时,我得到的所有内容都按预期运行。

$metaCompetitions = DB::table('meta_competitions')
    ->select('meta_competitions.name as name', 'sports.name as sport', 'meta_competitions.id', 'meta_competitions.country')
    ->where('meta_competitions.name', 'LIKE', "%{$string}%")
    ->whereIn('meta_competitions.sport_id', [1, 3, 4, 9])
    ->join('sports', 'sports.id', '=', 'meta_competitions.sport_id');

$leagues = DB::table('primary_events')

    ->select('primary_events.name as name', 'sports.name as sport', 'primary_events.id', 'primary_events.country')
    ->where('primary_events.name', 'LIKE', "%{$string}%")
    ->whereIn('primary_events.sport_id', [1, 3, 4, 9])
    ->whereNull('primary_event_meta_competitions.primary_event_id')
    ->leftJoin('primary_event_meta_competitions', 'primary_event_meta_competitions.primary_event_id', '=', 'primary_events.id')
    ->leftJoin('sports', 'sports.id', '=', 'primary_events.sport_id')

    ->union($metaCompetitions)

    ->orderByRaw(
        'CASE
            WHEN name = ? THEN 1
            WHEN name LIKE ? THEN 2
            WHEN name LIKE ? THEN 4
            ELSE 3
          END', [$string, "{$string}%", "%{$string}"]
    )
    ->get();

    dd($leagues);

我从 - > toSql()得到的查询对我有用,如下:

(select `primary_events`.`name` as `name`, `sports`.`name` as `sport`, `primary_events`.`id`, `primary_events`.`country` from `primary_events` 
left join `primary_event_meta_competitions` on `primary_event_meta_competitions`.`primary_event_id` = `primary_events`.`id` 
left join `sports` on `sports`.`id` = `primary_events`.`sport_id` 
where `primary_events`.`name` LIKE '%Allsvenskan%' and `primary_events`.`sport_id` in (1, 3, 4, 9) and `primary_event_meta_competitions`.`primary_event_id` is null) 
union (select `meta_competitions`.`name` as `name`, `sports`.`name` as `sport`, `meta_competitions`.`id`, `meta_competitions`.`country` from `meta_competitions` 
inner join `sports` on `sports`.`id` = `meta_competitions`.`sport_id` 
where `meta_competitions`.`name` LIKE '%Allsvenskan%' and `meta_competitions`.`sport_id` in (1, 3, 4, 9)) 
order by CASE
                WHEN name = 'Allsvenskan' THEN 1
                WHEN name LIKE 'Allsvenskan%' THEN 2
                WHEN name LIKE '%Allsvenskan' THEN 4
                ELSE 3
              END

我的表格如下:

meta_competitions
id:name:sport_id:country

primary_events
id:name:sport_id:country

sports
id:name

primary_event_meta_competitions
primary_event_id:meta_competition_id

1 个答案:

答案 0 :(得分:1)

这是一个奇怪的问题。当我没有orderByRaw但使用selectRaw到自定义列并对该列进行排序时,一切都按预期工作。

为什么这会有所不同?

    $metaCompetitions = DB::table('meta_competitions')
        ->select('meta_competitions.name as name', 'sports.name as sport', 'meta_competitions.id', 'meta_competitions.country')
        ->selectRaw('CASE
                WHEN meta_competitions.name = ? THEN 1
                WHEN meta_competitions.name LIKE ? THEN 2
                WHEN meta_competitions.name LIKE ? THEN 4
                ELSE 3
              END AS order_col', [$string, "$string%", "%$string"] )
        ->selectRaw("'meta_competition' AS type")
        ->where('meta_competitions.name', 'LIKE', "%{$string}%")
        ->whereIn('meta_competitions.sport_id', [1, 3, 4, 9])
        ->join('sports', 'sports.id', '=', 'meta_competitions.sport_id');

    $leagues = DB::table('primary_events')

        ->select('primary_events.name as name', 'sports.name as sport', 'primary_events.id', 'primary_events.country')
        ->selectRaw('CASE
                WHEN primary_events.name = ? THEN 1
                WHEN primary_events.name LIKE ? THEN 2
                WHEN primary_events.name LIKE ? THEN 4
                ELSE 3
              END AS order_col', [$string, "$string%", "%$string"] )
        ->selectRaw("'league' AS type")
        ->where('primary_events.name', 'LIKE', "%{$string}%")
        ->whereIn('primary_events.sport_id', [1, 3, 4, 9])
        ->whereNull('primary_event_meta_competitions.primary_event_id')
        ->leftJoin('primary_event_meta_competitions', 'primary_event_meta_competitions.primary_event_id', '=', 'primary_events.id')
        ->leftJoin('sports', 'sports.id', '=', 'primary_events.sport_id')

        ->union($metaCompetitions)

        ->orderBy('order_col')

        ->get();