Laravel Отношения модели автоматически получают и все другие отношения модели. - PullRequest
0 голосов
/ 19 июня 2020

Я надеюсь, что кто-то может мне помочь.

У меня есть 3 модели, такие как User, Task и Subtask. Они уже связаны через hasOne или hasMany. Все нормально работает. Теперь я вызываю данные через Task :: where (..) -> with (['user', 'subtask']) ... и получаю соответствующие результаты.

Проблема в том, что Subtask имеет ссылка на пользователя, и я не получаю запрашиваемую информацию о пользователе, когда я использую модель задачи.

Если я использую модель подзадач, я получаю информацию о пользователе.

Как я могу это настроить все ссылки на запрошенные модели также одновременно запрашиваются из базы данных?

1 Ответ

0 голосов
/ 19 июня 2020

Чтобы сразу вернуть больше данных о взаимосвязях, вы можете использовать следующий механизм:

$Data = $Task::where(...)
    ->with([
        'user'=>function($userQuery){
            // mechanism is recursive; you can extend it to infinity :)
            $userQuery->with([
                            'other', 
                            'relationships', 
                            'here'=>function($hereQuery){ ... } 
                        ]); 
        },

        'subTask',

        'anotherRelationship' => function($anotherRelationship) {
            $anotherRelationship->select('column');
            $anotherRelationship->where('column2', 'whatever');
        }
    ])
    ->get();

// dump data
dd($Data);

Я не знаю, ищете ли вы это - если вы хотите загрузить некоторые После создания экземпляра модели вы можете добавить magi c переменную $with в код модели и указать, какие отношения вы хотите загрузить:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $fillable = ['col1', 'col2', 'col3', ...];

    // specify which relationships you want to load automatically
    protected $with = [
        'users',
        'anotherRelationship'=>function($anotherRelationshipQuery){
            $anotherRelationshipQuery->select( ... );
        },
        'andSomeOtherRelationship'

        ...
    ];

    ...
}

Теперь вам больше не нужно вручную загружать отношения при получении данных. Они загружаются автоматически:

$Data = $Tast::where( ... )->get();

dd($Data);

...