Laravel загружает все отношения для определенного ресурса - PullRequest
0 голосов
/ 08 июля 2019

У меня есть модель ниже, с определенным отношением fields.

//Stream.php
    /**
     * A stream can have many fields
     *
     * @return Illuminate\Database\Eloquent\Model
     */
    public function fields()
    {
        return $this->hasMany(Field::class);
    }

В моей базе данных у меня есть два потока:

//table: streams
id | name
1  | doc_stream
2  | email_stream

И 4 поля:

//table: fields
id | stream_id | name
1  | 1         | Field #1
2  | 1         | Field #2
3  | 1         | Field #3
4  | 2         | Field #4

Итак, с помощью этой настройки я подумал, что могу просто сделать:

//streams/1/fields/1
public function show(Stream $stream, Field $field)
{
   dd($stream->with('fields')->get());
}

Который затем вернет все поля, только для $stream.id = 1.

Однако отношение загружает все потоков:

enter image description here

Не могу ли я загрузить отношения только для определенного ресурса, который я показываю?

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Похоже, вы используете привязку модели маршрута для разрешения $field. И использовать $stream->with('fields')->get(); для загрузки отношения.

Это все работает как задумано, я думаю, здесь есть недоразумение о том, как работают привязка модели маршрута и отношения.

$stream->with('fields')->get();

Это загрузит все потоки, так как он начинает новый запрос и аналогично выполнению Stream::with('fields')->get().

Если вам нужно конкретное поле для вашего потока, вы можете сделать:

$field = $stream->fields()->findOrFail($fieldId);

В вашем методе контроллера, который будет выглядеть примерно так

// streams/1/fields/1
public function show(Stream $stream, $fieldId)
{
   // findOrFail will throw a 404 if the field could not be found for the specific stream
   $field = $stream->fields()->findOrFail($fieldId);

   dd($field);
}

$stream с идентификатором 1 (для вашего примера url) будет разрешен привязкой модели маршрута.

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

// streams/1/fields/1
public function show(Stream $stream, Field $field)
{
   dd($field);
}

Однако это также загрузит поле для другого потока (поле не принадлежит), поскольку оно не знает, как охватить запрос для потока с идентификатором 1.

0 голосов
/ 08 июля 2019

Я думаю, что таблица стримов должна иметь атрибут field_id, и вам следует отредактировать функцию, как показано ниже:

public function fields()
 {
    return $this->hasMany(Field::class, 'field_id', 'id');
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...