【发布时间】:2018-02-06 14:44:32
【问题描述】:
我在一个项目中运行此查询,其中我有“meta_competitions”和“primary_events”,它们将合并到一个结果中,它们不会与具有当前 primary_event 的 primary_event_id 的 primary_event_meta_competitions 重叠。
查询本身的一切都按预期工作,我们得到了我们想要的结果。但是当我们添加 orderByRaw() 时,meta_competitions 中除了一个结果之外的所有内容都会被删除。
我尝试运行我在纯 sql 中运行“->toSql()”而不是 ->get() 时得到的查询,并且一切都按预期工作。
$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
【问题讨论】:
-
如果您没有找到答案,请使用
DB::Select()与原始 sql