我有一个车辆表。车辆可以转让。当车辆转移给新所有者时,表中会添加另一行,其中包含不同的详细信息。旧车辆的 vehicles_transfer
列填充了该新行的 ID。
车辆可以多次转移。这是车辆表:
+--------------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+------------------+------+-----+---------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| vehicles_vin | varchar(255) | NO | UNI | NULL | |
| vehicles_model_id | int(11) | NO | | NULL | |
| vehicles_transfer | int(11) | YES | | NULL | |
+--------------------+------------------+------+-----+---------------------+-----------------
现在我陷入了困境。我有一辆车转让了5次。
首次注册时,其 ID 为 5
,并已转让给车辆表 ID 7
的新车主。因此,vehicles_transfer
列填充为 7
。 vehicles_transfer
列表示此车辆已转移到填写的 ID。
然后车辆id7
被进一步转移到id12
,因此,其vehicles_transfer
列被填充为12。
这个过程已经发生了 3 次了。
现在我有了当前车辆的 ID,我想知道这辆车之前被转移了多少次。我还创建了一个函数getOldVehicleId()
,它获取车辆的id
并提供vehicles_transfer
值。
但我不知道如何获取所有旧的 vehicles_transfer
值?
编辑: 基本上我想让这个动态起来
$oldVehicle1 = Vehicle::withTrashed()->where('vehicles_transfer', $id)->first();
if($oldVehicle1){
$oldVehicleIds[] = $oldVehicle1->id;
$oldVehicle2 = Vehicle::withTrashed()->where('vehicles_transfer', $oldVehicle1->id)->first();
if($oldVehicle2){
$oldVehicleIds[] = $oldVehicle2->id;
$oldVehicle3 = Vehicle::withTrashed()->where('vehicles_transfer', $oldVehicle2->id)->first();
if($oldVehicle3){
$oldVehicleId[]s = $oldVehicle3->id;
$oldVehicle4 = Vehicle::withTrashed()->where('vehicles_transfer', $oldVehicle3->id)->first();
}else return $oldVehicleIds;
}else return $oldVehicleIds;
}
最佳答案
从你所说的情况来看,你的设计中没有这样的方式。没有关于谁过去拥有这辆车的信息。 在我看来,这个设计不是很好。您一遍又一遍地复制车辆数据,同时您正在丢失有关其原始 ID 的信息。 您应该保持未更改的数据是唯一的。 我最好的想法是所有权表,您将在其中保存 user_id 和vehicle_id 以及所有权日期。从此时起,您可以在此表中包含一些状态列和结束所有权的日期,也可以使用所有权历史记录创建表(取决于将来表的大小)。
好的。因此,在您的设计中,要计算传输次数,您必须获得当前的车辆 ID。查找具有此 id 的vehicle_transfer,获取此车辆 id 并在传输列中查找它,依此类推。但前提是不存在重复的转移值。所以就像我说的,你的设计不好。
如果你坚持走你的路并想按照你的设计走。使用递归函数。像这样的soemtihn:
function getOldVehiclesIds(&$oldVehicleIds,$id)
{
$oldVehicle = Vehicle::withTrashed()->where('vehicles_transfer', $id)->first();
if($oldVehicle){
$oldVehicleIds[] = $oldVehicle->id;
getOldVehiclesIds($oldVehicleIds,$oldVehicle->id);
}
else
{
return $oldVehicleIds;
}
}
$oldVehicleIds = array();
$oldVehicleIds = getOldVehiclesIds($oldVehicleIds,$id);
您可能需要稍微调整一下。但我希望你能明白这个概念。
关于php - 动态获取不同关联行的旧列值(在 Laravel 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301469/