其中年份 在Laravel的年份列表中

Where Year In list of years Laravel

提问人:Yasser CHENIK 提问时间:7/7/2023 更新时间:7/7/2023 访问量:51

问:

我想做的是这样的:


$listOfYears = Invoice::pluck('year') ; // [ 2001, 2002, 2003 ]
$products = Product::whereYearIn('purchase_date',$listOfYears)->get();

字段 purchase_date 是 type,所以你不能只使用 ,你需要应用 1st,然后 .
显然这是行不通的,因为不存在......
我以最缓慢和最丑陋的方式做到了这一点:
datewhereInwhereYearwhereInwhereYearIn


$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 ) ;
Laravel 急切地加载 其中

评论

0赞 Yasser CHENIK 7/7/2023
有办法吗?$products = Product::whereIn('YEAR(purchase_date)',$listOfYears)->get();
1赞 francisco 7/7/2023
你真的想要 ?因为你可以用 by 和 do a 来做一个范围where inforeachyears$query->orWhereYear('purchase_date', $year);
0赞 Yasser CHENIK 7/7/2023
@francisco这是一个很好的建议,这正是我想要的!
0赞 francisco 7/7/2023
检查是否有效

答:

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();

请参阅此处,详细了解文档上的范围。