php - 动态获取不同关联行的旧列值(在 Laravel 中)

标签 php mysql sql laravel relation

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

然后车辆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/

相关文章:

Mysql 检查一个存储过程是否被另一个存储过程调用

java - hibernate hbm2ddl.auto 默认值

php - 通过路由防止 CakePHP Controller 访问

php - $ Composer 找不到 mongodb 扩展,需要 Mongodb 扩展

javascript - Laravel 数组转 json 格式

python - 从 json 创建的 Pandas 数据框具有未命名列 - 由于未命名列问题无法插入 MySQL

c# - 如何使用 C# 从 ASP.Net 中的数据库中获取最新记录?

mysql - 按范围计数仅返回一行

sql - 在 mySQL 中将字符串格式化为日期

php - 使用mysqli登录系统