我是Laravel框架的新手,我可能需要你的一些帮助。
有人能帮我把这个请求转换成Eloquent吗?
SELECT * FROM `non_working_days` WHERE YEAR(date) = "2021" AND (country = "Paris" OR country = "Madrid")
目前我已经设法找到了一个解决方案,但我正在运行与参数数量一样多的查询。
foreach ($calendar as $code) {
array_push(
$data,
Model::query()
->whereYear('date', '=', $year)
->where('country', $code)
->get()
);
}
所以它归结为:
SELECT * FROM `non_working_days` WHERE YEAR(date) = "2021" AND country = "Paris"
SELECT * FROM `non_working_days` WHERE YEAR(date) = "2021" AND country = "Madrid"
所以我不认为这是非常有效的知道我可能会有更多的参数。
感谢您可以使用where方法:
$countries = ['Paris', 'Madrid']; // or use $calendar instead if it's an array
$data = Model::query()
->whereYear('date', '=', $year)
->whereIn('country', $countries)
->get();
这会给你一个这样的查询:
SELECT * FROM `non_working_days` WHERE YEAR(`date`) = "2021" AND `country` IN ("Paris", "Madrid");
你可以做到,通过
Model::query()
->whereYear('date', '=', $year)
->where( function( $whereQry ) use( $country_1, $country_2 ) {
$whereQry->orWhere( 'country', $country_1 );
$whereQry->orWhere( 'country', $country_2 );
})
->get();
它会转换成你需要的东西,
SELECT * FROM `non_working_days` WHERE YEAR(date) = "2021" AND (country = "Paris" OR country = "Madrid")
你可以使用where in来实现这一点,你不需要为这个做循环,像这样:-
Model::query()
->whereYear('date', '=', $year)
->whereIn('country', $calendar)
->get()