Получить старые значения столбцов разных связанных строк динамически (в 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);
Возможно, вам придется немного изменить его. Но я надеюсь, что вы получите концепцию.