【问题标题】:Get old column values of different associated rows dynamically(in laravel)动态获取不同关联行的旧列值(在 laravel 中)
【发布时间】:2014-08-14 06:31:32
【问题描述】:

我有一个车辆表。车辆可以转让。当车辆转移给新所有者时,表格中会添加另一行,其中包含不同的详细信息。旧车的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 列填充了7vehicles_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;
}

【问题讨论】:

  • 如果每次转移车辆时都添加一行,那么计算行数就会给出转移计数?不会吗?
  • 不会的。所有车辆都存在于车辆表中(包括所有其他车辆)。
  • 我的意思是,按 VehicleId 和 sql 分组
  • 我没明白你的意思。可以举个例子吗?

标签: php mysql sql laravel relation


【解决方案1】:

从你所说的一切来看,你的设计中没有这样的方式。没有关于过去谁拥有这辆车的信息。 在我看来,这个设计不是很好。您一遍又一遍地复制车辆数据,同时您正在丢失有关其原始 ID 的信息。 您应该使未更改的数据保持唯一。 我最好的想法是所有权表,您将在其中保留 user_id 和 vehicle_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);

您可能需要稍微调整一下。但我希望你能明白这个概念。

【讨论】:

  • vehicles_transfer 列显示这辆车已转移到该列中存在的值。因此,如果我有汽车的当前 ID,我可以检查这辆车以前是别人的汽车,因为某行的 vehicles_transfer 列将填充当前汽车的 ID。如果ID为2的车辆被转移到ID为3的车辆,则vehicles_transfer行列(id2)将被3填充。
  • 如果3被转移到4,那么vehicles_transfer列的3将被4填充
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多