我正在一个项目中运行此查询,我正在将“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
答案 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();