Доступ к отношениям Laravel SQL без локального ключа

Я новичок в Laravel. У меня две модели: User и Car. Я хочу получить доступ к данным автомобиля из пользовательского объекта в контроллере, но не смог найти, как это сделать. Кроме того, в базе данных есть столбцы, и администратор отказывается вносить в нее какие-либо изменения.

Вот модель User:

class User extends Model {
  protected $primaryKey = 'idUser';
  protected $fillable = [
    'name', 'age', 'address', 'gender', 'phone', 'email'
  ];
}

А это моя модель Car:

class Car extends Model {
  protected $primaryKey = 'idCar';
  protected $fillable = [
    'carNumber', 'carMachineNumber', 'type', 'model', 'year', 'idUser'
  ];

  public user(){
    return $this->belongsTo(User::class, 'idUser');
  }
}

Я хочу, чтобы в контроллере и в шаблонах лезвий я мог получить доступ к данным автомобиля от объекта пользователя. Например, когда я хочу получить данные о типе автомобиля, я могу получить к ним доступ:

$user->car->type

Было бы даже лучше, если бы я смог получить доступ ко всем автомобилям, которые есть у пользователя, с помощью этой строки кода:

$user->car->all();

Как сделать это возможным? Что мне добавить к контроллерам, не внося никаких изменений в базу данных? Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
32
1

Ответы 1

У вас нет стандартного первичного ключа id, поэтому вам придется указать все ключи в отношении (idCar).

Модель автомобиля

public function user() {
    return $this->belongsTo(User::class, 'idUser', 'idCar');
}

Но это даст вам $car->user, который является владельцем машины. Благодаря тому, как вы спроектировали свою базу данных, у пользователя может быть много автомобилей.

Модель пользователя

public function cars() {
    return $this->hasMany(Car::class, 'idUser', 'idUser');
}

Если вы хотите получить автомобили, принадлежащие пользователю, вы можете

$user->cars;

или же

foreach($user->cars as $car) {
    // $car
}

Не могли бы вы объяснить, почему вы использовали idUser в качестве внешнего ключа для idCar? Разве эта связь не означает, что Автомобиль 1 принадлежит пользователю 1, Автомобиль 2 принадлежит пользователю 2 и так далее? Это соответствует случаю Автомобиль 1 и автомобиль 2 принадлежат пользователю 1?

Dhana D. 30.03.2021 09:42

В модели Car есть поле idUser, которое является внешним ключом для модели User. idCar - это не внешний ключ, а первичный ключ.

Anurat Chapanond 30.03.2021 09:45

Правильно, автомобиль может принадлежать одному пользователю, но у пользователя может быть много автомобилей.

Anurat Chapanond 30.03.2021 09:46

Могу ли я получить доступ к данным автомобиля от пользователя без необходимости присоединяться к таблице / использовать оператор where и просто используя красноречивые отношения, такие как $user->car->all()?

Dhana D. 30.03.2021 09:52

да, просто $ user-> cars должны доставить вам все автомобильные объекты.

Anurat Chapanond 30.03.2021 09:52

@Dhana D. вы пытаетесь использовать $ user-> car-> all (), но all () работает только с моделью и не работает с красноречивым отношением. Итак, добавьте отношение cars () в свою модель пользователя и получите доступ ко всем автомобилям, которые есть у пользователя, например $ user-> cars (), как и предложил Анурат.

Psycho 30.03.2021 10:16

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