Laravel Eloquent: отношения hasManyThrough Many to Many

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

АВТОМОБИЛЬ.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');
    }
}

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

Laravel Eloquent: отношения hasManyThrough Many to Many

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

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

Кажется, что Транспортное средство - это свойство Путешествий, поэтому лучше всего пройти через эти отношения. Если вам нужен метод легкого доступа к Транспортным средствам, используемым пользователем на протяжении его путешествий, я бы создал какой-то репозиторий или службу для этой логики ... нет в модели пользователя.

Andrew Mack 22.10.2018 12:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
1
1 470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не проверял это. Однако должна быть возможность получить все vehicles, перебрав все userjourneys, создав массив транспортных средств и вернув его как 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();

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

Добро пожаловать, @Mateo!

thisiskelvin 22.10.2018 13:02

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