我有一张车位。车辆是可以转让的。将车辆转移给新车主时,会向表中添加另一行,其中包含不同的详细信息。Old vehicle的vehicles_transfer
列使用新行的id填充。
车辆可以多次转移。这是vehicle表:
+--------------------+------------------+------+-----+---------------------+----------------+
| 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。
然后,车辆id 7
被进一步转移到id 12
,因此,它的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;
}
发布于 2014-08-14 14:43:20
从你所说的一切来看,你的设计中没有这样的方式。没有关于过去谁拥有这辆车的信息。在我看来,这个设计不是很好。您一次又一次地复制车辆数据,同时您还丢失了有关其原始ID的信息。您应该保持未更改的数据的唯一性。我最好的想法是所有权表,在那里你将保存user_id和vehicle_id以及拥有日期。从这一点开始,您可以在该表中包含一些status列和所有权终止日期,也可以使用ownership_history创建表(这取决于将来表的大小)。
好的。因此,在你的设计中,为了计算传输次数,你必须获得当前的车辆id。查找具有此id的vehicle_transfer,获取此车辆id并在transfer列中查找它,依此类推。但仅当不存在重复的转移值时。所以就像我说的,你的设计不好。
如果你坚持走自己的路,并想继续你的设计。使用递归函数。就像这样:
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);
你可能需要稍微考虑一下。但我希望你能理解这个概念。
https://stackoverflow.com/questions/25301469
复制相似问题