Получить старые значения столбцов разных связанных строк динамически (в laravel)

У меня есть автомобильный столик. Транспортные средства могут быть переданы. Когда транспортное средство передается новому владельцу, в таблицу добавляется еще одна строка с другими деталями. Старый автомобиль vehicles_transfer столбец заполнен идентификатором этой новой строки.

Транспортные средства могут быть переданы несколько раз. Вот таблица транспортных средств:

+--------------------+------------------+------+-----+---------------------+----------------+
| 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 раз.

Когда он был зарегистрирован в первый раз, его идентификатор был 5 и он был передан новому владельцу с идентификатором таблицы транспортного средства 7, Так vehicles_transfer колонка была заполнена 7, vehicles_transfer В колонке написано, что это транспортное средство переведено на заполненный идентификатор.

Тогда идентификатор автомобиля 7 был передан дальше в id 12, Так что это vehicles_transfer колонка была заполнена 12.

Этот процесс происходил еще 3 раза.

Теперь у меня есть идентификатор текущего автомобиля, и я хочу знать, сколько раз этот автомобиль был передан ранее. я также сделал функцию 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;
}

1 ответ

Из всего, что вы сказали, нет такого способа в вашем дизайне. Нет информации о том, кто имел эту машину в прошлом. На мой взгляд, этот дизайн не очень хорош. Вы дублируете данные транспортных средств снова и снова, и в то же время вы теряете информацию о его оригинальном идентификаторе. Вы должны сохранять данные, которые не были изменены, уникальными. Моя лучшая идея - это таблица владения, где вы будете хранить user_id и vehicle_id и даты владения. С этого момента вы можете либо в этой таблице иметь некоторый столбец состояния и дату окончания владения, либо вы можете создать таблицу с Owning_history (в зависимости от того, насколько большими будут таблицы в будущем).

ХОРОШО. Таким образом, в вашем дизайне для подсчета переводов вам нужно будет получить настоящий идентификатор vehicel. Посмотрите на vehicle_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);

Возможно, вам придется немного изменить его. Но я надеюсь, что вы получите концепцию.

Другие вопросы по тегам