Проблемы с пониманием Красноречивые отношения - PullRequest
0 голосов
/ 15 апреля 2019

У меня проблемы с пониманием отношений Eloquent.

Допустим, у меня есть четыре таблицы с данными

Пользователи

id
...

UserCars

user_id
car_id
color_id

Автомобили

id
make
model

Цвета

id
color

Теперь я понимаю, как получить UsersCars для выбранного пользователя с помощью

User.php Model

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

Я могу затем получить машину пользователяв представлении с

    public function show(User $user)
    {
        $cars= $user->cars;

        return $cars;
    }

Так, например, у данного идентификатора пользователя 1 есть 2 машины, я могу получить его машины с помощью $ user-> cars (), что дает мне что-то похожее на представление

{"id":1, "car_id":3, "color_id": 2}
{"id":1, "car_id":10, "color_id": 4}

Но что я не получаю, так это как потом получить действительное значение соответствующих идентификаторов.Поэтому, как только я передал $ users-> cars () как $ cars в моем контроллере, на мой взгляд, я смогу узнать фактическую марку, модель и цвет машины пользователя.

Что-то вроде

@foreach ($cars as $car)
    {{ $car->make }} : {{ $car->model }}
    {{ $car->color }}
@endforeach

Так что, как только я позвоню $ user-> cars (), мне нужно что-то вроде

{"id":1, "car_id":3, "make" => "Ford", "model" => "Fiesta", "color_id": 2, "color":"red"}
{"id":1, "car_id":10, "make" => "Volkswagon", "model" => "Golf", "color_id": 4, "color":"blue"}

Надеюсь, это имеет смысл, и любая помощь приветствуется, спасибо.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Вы можете получить доступ ко всем этим данным через отношения.Просто определите их и загружайте их по мере необходимости.Сначала давайте определим все основные отношения в файлах вашей модели

В модели Users:

// User.php

public function user_cars()
{
    return $this->hasMany(App\UserCar::class);
}

В модели UserCars:

// UserCar.php

public function user()
{
    return $this->belongsTo(App\User::class);
}

public function car()
{
    return $this->belongsTo(App\Car::class);
}

public function color()
{
    return $this->belongsTo(App\Color::class);
}

В модели Cars:

// Car.php

public function user_cars()
{
    return $this->hasMany(App\UserCar::class);
}

Со всем, что определено, вы можете получить доступ к отношениям, просто обратившись к ним.Разница между $car->user_cars() и $car->user_car - это возвращаемый объект.

$car->user_cars() является экземпляром HasMany объекта, а $car->user_cars является Collection экземпляром.По сути, это то же самое, что писать $car->user_cars()->get(), так что большую часть времени вы хотите продолжить.

Теперь давайте посмотрим на ваш метод контроллера.Технически вы можете вернуть $user и получить доступ ко всем отношениям в представлении, но каждый раз, когда вы это делаете, это дополнительный запрос к базе данных.Этого следует избегать, загружая все данные в первую очередь.Поскольку вы используете привязку модели маршрута , чтобы получить $user, вам необходимо использовать функцию load().Вы даже можете загружать вложенные отношения, это именно то, что вы ищете.

public function show(User $user)
{
    // This tells eloquent to add the nested relationships to your User instance.
    $user->load('user_cars.car', 'user_cars.color');
    return $user;
}

Далее вы можете получить к ним доступ в виде, как вы хотели

@foreach ($user->user_cars as $user_car)
    {{ $user_car->car->make }}
    {{ $user_car->car->model }}
    {{ $user_car->color->color }}
@endforeach

Подробнеепо теме https://laravel.com/docs/5.8/eloquent-relationships

0 голосов
/ 15 апреля 2019

Вы неправильно определили отношение в User к Car.

Поскольку отношения с пользователями и автомобилями many-to-many, необходимо использовать belongsToMany() красноречивое отношение.

doc => https://laravel.com/docs/5.8/eloquent-relationships#many-to-many

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

public function cars()
{
    return $this->belongsToMany(Car::class, 'user_cars', 'user_id', 'car_id');
}

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

public function users()
{
    return $this->belongsToMany(User:class, 'user_cars', 'car_id', 'user_id');
}

, затем вы можетедоступ cars из user или users из car.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...