Php 动态获取不同关联行的旧列值(在laravel中)

Php 动态获取不同关联行的旧列值(在laravel中),php,mysql,sql,laravel,relation,Php,Mysql,Sql,Laravel,Relation,我有一张汽车表。车辆可转让。将车辆转让给新车主时,会向表中添加另一行,其中包含不同的详细信息。旧车辆的车辆转移列将填充该新行的id 车辆可以多次转移。这是车辆表: +--------------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default

我有一张汽车表。车辆可转让。将车辆转让给新车主时,会向表中添加另一行,其中包含不同的详细信息。旧车辆的车辆转移列将填充该新行的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的新车主。因此,转移柱中填充了7个。vehicles\u transfer(车辆转移)栏表示此车辆转移到已填写的id

然后,车辆id 7被进一步转移到id 12,因此,其车辆_转移栏中填充了12

这个过程又发生了3次

现在,我有了当前车辆的id,我想知道该车辆以前被转移了多少次。我还制作了一个函数getOldVehicleId,它获取车辆的id并提供车辆的传输值

但我不明白如何让所有的旧车传递价值

编辑: 基本上,我想让它充满活力

$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的信息。 您应该保持未更改的数据的唯一性。 我最好的想法是拥有权表,您将保留用户id和车辆id以及拥有权日期。从这一点来说,您可以在此表中有一些状态列和结束所有权的日期,也可以创建具有所有权历史的表,具体取决于将来表的大小

嗯。因此,在您的设计中,您必须获得当前的车辆id。使用此id查找车辆转移,获取此车辆id并在“转移”列中查找,依此类推。但前提是不存在重复的传输值。就像我说的,你的设计不好

如果你坚持走自己的路,想按照自己的设计走。使用递归函数。苏姆蒂恩是这样说的:

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

你可能需要仔细考虑一下。但我希望您能理解这个概念。

如果每次车辆转移时都添加一行,则计算行数将得到转移计数?。不会吧?不会的。所有车辆都在车辆表中,包括所有其他车辆。我的意思是,按车辆ID和sqlI分组,我没有得到你的分数。你能举个例子吗?vehicles\u transfer一栏显示这辆车被转移到该栏中的值。因此,如果我有一辆车的当前id,我可以检查这辆车以前是其他人的车,因为某行的“车辆”传输列将填充当前车的id。如果id为2的车辆被转移到id为3的车辆,则id为2的世界其他地区的车辆转移栏将填充3。此外,如果3被转移到4,则id为3的车辆转移栏将填充4