Переключение с Limit () на First () в модели Laravel

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

На данный момент у меня в одной из моих моделей есть следующий код:

public function attachments(){
    return $this->hasMany(volunteerAttachment::class, 'volunteerID','id');
}

 public function photoID() {
    $photoID= $this->attachments()->where('category','Drivers License')->orderBy('endDate','desc')->limit(1);
    return $photoID;
}

Я хотел бы сделать то, что я считал относительно простым - заменить limit(1) функции photoIdentification на простой first().

Но когда я пробую это и просто вставляю {{$volunteer->photoID->id}} в свой блейд, он просто возвращает ошибку App\volunteer::photoID must return a relationship instance.

Однако я знаю, что существует связь, потому что, если я продолжу использовать limit(1) и поставлю:

@foreach($volunteer->photoID as $id) 
   {{$id->id}}
@endforeach

Он правильно возвращает отношение и документ.

$volunteer - это переменная для этой конкретной модели App\volunteer, и в контроллере она определяется следующим образом:

    public function show(Volunteer $volunteer){
            return view('volunteer.show', compact('volunteer'));
    } 

Что такое $volunteer.

thefallen 13.06.2018 16:21
$volunteer - это просто переменная для этой конкретной модели App \ volunteer.
Matthew 13.06.2018 16:21

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

thefallen 13.06.2018 16:22

Ну, кроме контроллера, который я только что включил, все есть. Как я уже сказал, он работает в одном случае, когда он возвращается в виде коллекции, но не во втором способе (с первым), когда он должен возвращать один экземпляр.

Matthew 13.06.2018 16:25

Думаю, это могло быть связано с добавить пользовательскую функцию в модель Laravel. Попробуйте вместо этого использовать аксессуар

Alberto 13.06.2018 16:26

@Alberto - Большое спасибо! Вы указали мне правильное направление, и я заставил его работать. Хотели бы вы опубликовать это как свой ответ, чтобы я мог его принять? Еще раз спасибо!

Matthew 13.06.2018 16:32

Можете ли вы разместить содержание модели «Волонтер»?

Amandeep Singh 13.06.2018 16:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
7
204
2

Ответы 2

Функция photoID() по-прежнему будет возвращать полный объект volunteerAttachment. Если вы хотите получить идентификатор с помощью функции first(), вам нужно будет выбрать свойство id для объекта следующим образом:

{{ $volunteer->photoID()->id }}

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

public function getPhotoidAttribute($value)
{
    return $this->attachments()->where('category','Drivers License')->orderBy('endDate','desc')->first()->id;
}

Теперь в клинке вы можете просто использовать:

{{ $volunteer->photoid }}

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

public function getPhotoidAttribute($value) {
    $photoID= $this->attachments()->where('category','Drivers License')->orderBy('endDate','desc')->first();
    return $photoID->id;
}

и назовите это так:

{{ $volunteer->photoid }}

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