提问人:Yasser CHENIK 提问时间:7/7/2023 更新时间:7/7/2023 访问量:51
其中年份 在Laravel的年份列表中
Where Year In list of years Laravel
问:
我想做的是这样的:
$listOfYears = Invoice::pluck('year') ; // [ 2001, 2002, 2003 ]
$products = Product::whereYearIn('purchase_date',$listOfYears)->get();
字段 purchase_date 是 type,所以你不能只使用 ,你需要应用 1st,然后 .
显然这是行不通的,因为不存在......
我以最缓慢和最丑陋的方式做到了这一点:date
whereIn
whereYear
whereIn
whereYearIn
$listOfYears = Invoice::pluck('year') ; // [ 2001, 2002, 2003 ]
$products = Product::all()->filter(function($prod) {
return in_array( date('Y',strtotime($prod->purchase_date)) , $listOfYears );
});
所以我问有没有办法实现这一目标?
此外,如果可以使用该方法在同一个查询中预加载年份,它也将非常优化。with
注意:这可以直接在MySQL中轻松完成
SELECT * FROM products
WHERE YEAR('purchase_date') in ( SELECT year FROM invoices ) ;
答:
1赞
Yasin Patel
7/7/2023
#1
您可以在 laravel eloquent 中使用函数。在原始查询中使用MySQL的一部分,它将返回从日期开始的年份。whereRaw()
extarct()
$products = Product::whereRaw('extract(year from purchase_date) = ?', $listOfYears)->get();
评论
0赞
Praveen
7/7/2023
你为什么使用提取物?
0赞
Yasin Patel
7/7/2023
它给出从日期开始的年/月。参考:javatpoint.com/mysql-extract
0赞
Praveen
7/7/2023
但是有不同的方法可以从日期中提取月份和年份,哪一种是有效的方法和最佳实践
0赞
Yasin Patel
7/7/2023
两者都是一样的。两者之间绝对没有区别,无论是在性能上还是在其他方面。
1赞
Praveen
7/7/2023
#2
试试这个
$products = Product::whereRaw("YEAR('purchase_date') in ?", $listOfYears)->get();
更新
$products = Product::whereRaw("YEAR(purchase_date) in ?", $listOfYears)->get();
1赞
francisco
7/7/2023
#3
您可以像这样在产品模型上创建范围:
public function scopeWhereYearIn($query, array $years)
{
foreach ($years as $year) {
$query->orWhereYear('purchase_date', $year);
}
}
然后将其用作:Product::whereYearIn($years)->get();
请参阅此处,详细了解文档上的范围。
评论
$products = Product::whereIn('YEAR(purchase_date)',$listOfYears)->get();
where in
foreach
years
$query->orWhereYear('purchase_date', $year);