gpt4 book ai didi

php - Laravel Eloquent 多列 IN 子句

转载 作者:可可西里 更新时间:2023-11-01 07:43:51 25 4
gpt4 key购买 nike

我最近开始使用 Laravel 进行开发,我的第一个项目是一个车辆预订应用程序。

我似乎做得很好,但是我无法尝试使用 Eloquent 显示当前预订。

系统的工作原理是将车辆添加到vehicles 表,将员工添加到employees 表。使用 employee_vehicle 创建与数据透视表的多对多关系。

员工

+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| first_name | varchar(50) | NO | | NULL | |
| surname | varchar(50) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+

车辆

+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| registration | varchar(10) | NO | | NULL | |
| make | varchar(50) | NO | | NULL | |
| model | varchar(50) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+

员工车辆

+-------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| employee_id | int(10) | NO | | NULL | |
| vehicle_id | int(10) | NO | | NULL | |
| direction | varchar(3) | NO | | NULL | |
| date_booked | datetime | NO | | NULL | |
| damaged | tinyint(1) | NO | | NULL | |
| mileage | int(10) | NO | | NULL | |
+-------------+------------+------+-----+---------+----------------+

结果

+----+-------------+------------+-----------+---------------------+---------+---------+
| id | employee_id | vehicle_id | direction | date_booked | damaged | mileage |
+----+-------------+------------+-----------+---------------------+---------+---------+
| 1 | 1 | 1 | OUT | 2016-06-13 09:08:08 | 0 | 2357 |
| 2 | 1 | 1 | IN | 2016-06-16 16:29:26 | 0 | 2401 |
| 3 | 2 | 1 | OUT | 2016-06-20 10:47:28 | 0 | 2470 |
| 4 | 3 | 2 | OUT | 2016-06-14 09:18:52 | 0 | 1403 |
+----+-------------+------------+-----------+---------------------+---------+---------+

这些表具有扩展 Eloquent 的 VehicleEmployee 模型。这些具有调用 belongsToMany 的方法。

我想要做的是获取 Vehicle 集合并急切地将员工加载到它上面。这样我就可以显示当前预订的车辆,以及目前已经预订的车辆。

例如:

$vehicleBookings = Vehicle::with(['employees'])->get();

我将解释预订的工作方式...

基本上,车辆和员工使用数据透视表链接在一起。该表还记录了预订日期、预订方向(例如预订入或出),以及有关其状况的其他数据等。

重要的是,IN 和 OUT 都有一个条目,以便在预订前后有车辆状况的审核日志。

我遇到的问题是能够从可用预订中获取车辆的最新状态,以确定它当前是否已被预订或可以预订。这决定了车辆可以做什么。

经过一些研究,我提出了以下查询:

SELECT * 
FROM `employee_vehicle`
WHERE (`vehicle_id`, `date_booked`) IN (
SELECT `vehicle_id`, MAX(`date_booked`)
FROM `employee_vehicle`
GROUP BY `vehicle_id`
)

(直到现在我什至不知道可以在 IN 子句中使用多个列,但这太棒了!)。

这给了我:

+----+-------------+------------+-----------+---------------------+---------+---------+
| id | employee_id | vehicle_id | direction | date_booked | damaged | mileage |
+----+-------------+------------+-----------+---------------------+---------+---------+
| 3 | 2 | 1 | OUT | 2016-06-20 10:47:28 | 0 | 2470 |
| 4 | 3 | 2 | OUT | 2016-06-14 09:18:52 | 0 | 1403 |
+----+-------------+------------+-----------+---------------------+---------+---------+

这为我提供了每辆曾经预订过的车辆的一行(这是在加入任何员工之前)。

但是现在我真的卡住了。我只是想不通如何使用 Eloquent 编写同样加入 Employees 的等效查询。 (它还需要只显示当前“OUT”的车辆,但我想这是微不足道的部分!)

可以只使用 DB::raw('...') 编写查询,并且不介意手动编写长 SQL 查询,但是我 < em>真的想尝试一下,尝试使用 Eloquent。

我注意到了 whereIn 方法,但它只接受一个列名称的字符串而不是多列的数组,所以这是不行的。 (除非我遗漏了什么,或者它计划用于 Laravel 的 future 版本?)

我从来都不是框架的真正粉丝,需要一些说服力,并且不想被打败,一直坚持使用 Laravel。这让我很沮丧,因为我觉得不乱用 Eloquent 会更快。如果我能让它起作用,那么我会更能接受它。

最佳答案

假设你已经

员工模型:

class Employee extends Model {
protected $table = 'employees';
public $timestamps = false;
}

和车型:

class Vehicle extends Model {
protected $table = 'employees';
public $timestamps = false;
}

并且您想获取按 vehicle_id 分组的最新日志。

所以做一个模型:

class EmployeeVehicle extends Model {
protected $table = 'employee_vehicle';
public $timestamps = false;

public function employee() {
return $this->belongsTo('App\Employee');
}

public function vehicle() {
return $this->belongsTo('App\Vehicle');
}
}

你向 DB 的请求将是这样的:

$EmployeeVehicles = EmployeeVehicle::with(['employee', 'vehicle'])
->where('date_booked', '>', date('Y-m-d H:i:s', (time() - 3*30*24*60*60)))
->groupBy('vehicle_id')
->selectRaw('*, MAX(`date_booked`) AS `last_date_booked`')
->paginate(50);

附注我添加了 where('date_booked', '>', date('Y-m-d H:i:s', (time() - 3*30*24*60*60)) 因为你的查询日志数据库对于数据库引擎来说是一项非常繁重的工作,为了性能安全,通常最好有过去 3 个月的数据。

并尝试分页,而不是获取所有内容。

关于php - Laravel Eloquent 多列 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37954462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com