Laravel Eloquent: имеет отношение "многие со многими" - PullRequest
0 голосов
/ 22 октября 2018

В моей модели Laravel 5.7 есть следующие классы (упрощенно):

VEHICLE.PHP

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Vehicle extends Model
{

    public function journeys()
    {
        return $this->hasMany('App\Journey');
    }

}

ПУТЕШЕСТВИЕ PHP

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Journey extends Model
{

    public function vehicle()
    {
       return $this->belongsTo('App\Vehicle');
    }

    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

USER.PHP

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{  

    public function journeys()
    {
        return $this->belongsToMany('App\Journey');
    }
}

У меня есть промежуточная таблица (trip_user) между пользователями и поездками (см. Схему в приложении).

enter image description here

Я могулегко получить все поездки, сделанные конкретным пользователем.Но как я могу получить все транспортные средства, используемые конкретным пользователем? Стандартный метод hasManyThrough не работает из-за связи между многими пользователями и поездками.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 22 октября 2018

Я не проверял это.Однако должна быть возможность получить все vehicles, пройдя по всем user journeys, создав массив транспортных средств и вернув его как collection.

. Это можно добавитьк вашему User.php контроллеру модели:

/**
 * Get all vehicles which user has used
 *
 */
public function vehicles()
{
    $vehicles = [];

    $this->journeys()
        ->each(function ($journey, $key) use (&$vehicles) {
            $vehicles[] = $journey->vehicle;
        });

    return collect($vehicles);
}

Здесь мы создаем пустой массив.Затем мы перебираем все поездки пользователей (передавая массив $vehicles в качестве ссылки для его обновления).

Мы используем метод сбора each() для циклического прохождения каждого journey.Мы создаем новую запись в массиве $vehicles, добавляя vehicle.

Наконец, мы возвращаем все vehicles как коллекцию.

Мы можем использовать это в нашем приложении какИтак:

User::find($id)->vehicles();

Примечание : Вы можете вернуть его как атрибут accessor , изменив имя функции на setVehiclesAttribute().Это позволит вам получить доступ к полю транспортного средства, как User::find($id)->vehicle.

...