Как использовать morphMany с пользовательской функцией в модели

#php #laravel #laravel-5 #eloquent

#php #laravel #laravel-5 #красноречивый

Вопрос:

(Речь идет о Laravel 5.8)

Я знаю, что вы можете создавать пользовательские функции в своей модели, но я не могу понять, как создать пользовательскую функцию, которая использует данные из функции morphMany.

Что работает:
model.php:

 public function images()
{
    return $this->morphMany('AppImage', 'owner');
}
  

page.blade.php:

 @foreach($model->images() as $image)
    {{ $image->url }}
@endforeach
  

Это работает. Но я хочу создать функцию, которая, например, возвращает только плакат. Но когда я помещаю этот foreach в функцию внутри моей модели. Это не будет перебирать изображения. Смотрите следующий код:

Что не работает:
model.php:

 public function images()
{
    return $this->morphMany('AppImage', 'owner');
}

public function poster()
{
    $images = $this->morphMany('AppImage', 'owner');

    foreach($images as $image)
    {
        /* THIS CODE WILL NEVER RUN SOMEHOW */
        if ($image->type == "poster")
        {
            return $image;
        }
    }
    return NULL;
}
  

Код просто возвращает NULL, чего мне не хватает?

Комментарии:

1. Вы забыли открыть { после foreach

2. @dparoli ой, ой.. Я отредактирую пример кода. Это была не та ошибка, которую я получал 😉 но хорошая работа по ее поиску 🙂

Ответ №1:

Вы хотели бы использовать средство доступа, $model->images которое возвращает коллекцию, вместо конструктора запросов, $model->images() который возвращает конструктор запросов, т.е:

 //page.blade.php
@foreach($model->images as $image)
    {{ $image->url }}
@endforeach

// in Model    
public function poster()
{ 
    foreach($this->images as $image)
    {
        if ($image->type == "poster")
        {
            return $image;
        }
    }
    return NULL;
}
  

Комментарии:

1. Пожалуйста, не редактируйте мой ответ, это то, на что я действительно хочу ответить, попробуйте код и посмотрите, что у вас получится