2016-10-10 3 views
0

Я добавляю функцию анонса в мое приложение.Доступ к отношениям отношений

У меня есть announcements таблицу, в которой хранится объявление и announcement_active таблицу, которая хранит undismissed объявления для каждого пользователя.

Когда создается объявление, в таблице announcements создается запись, чтобы сохранить это, и запись, введенная в таблицу announcement_active для каждого пользователя для этого объявления.

Моя модель пользователя имеет отношения для активных объявлений:

public function activeAnnouncements() 
    { 
     return $this->hasMany('App\ActiveAnnouncements'); 
    } 

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

@if (Auth::user()->activeAnnouncements()->count() > 0) 
    //code 
@endif 

Вышеуказанное работает отлично, это когда я пытаюсь сделать цикл for each на объявлениях, которые возникают у меня:

@if (Auth::user()->activeAnnouncements()->count() > 0) 
    @foreach(Auth::user()->activeAnnouncements()->announcement as $announcement) 
     //code to display announcement 
    @endforeach 
@endif 

Это когда я цепляю ->announcement, что я бегу в неприятности. Я определил отношения как так:

public function announcement() 
    { 
     return $this->belongsTo('\App\Announcements'); 
    } 

Однако я получаю ошибку:

Undefined property: Illuminate\Database\Eloquent\Relations\HasMany::$announcement

При использовании Тинкера и работает \App\User::find(1)->activeAnnouncements()->first()->announcement правильного объявление шоу.

Где я ошибаюсь при попытке загрузить их в мой цикл foreach?

ответ

1

Вы никогда не извлекаете данные в своем foreach. Вместо этого Laravel думает, что вы говорите: «Составьте этот запрос, не выполняйте его, а затем ищите свойство, называемое« объявлением »на нем». Если вы просто изменить его на get() вызов, он должен работать:

@foreach(Auth::user()->activeAnnouncements()->get() as $announcement) 

Или еще лучше, использовать автоматическую версию свойства:

@foreach(Auth::user()->activeAnnouncements as $announcement) 

Кстати, похоже, что вы можете проверить из @each функциональности клинка: https://laravel.com/docs/5.3/blade#rendering-views-for-collections

+0

Я буквально только что пришел к решению '-> get()', когда вы ответили. Однако мне определенно нравится автоматическая версия свойств больше. Будет проверено, что '@ каждая' функциональность в ближайшее время, с первого взгляда это выглядит полезным! Спасибо, Джоэл! – James

+0

Привет, я рад, что это помогло. :) –

0

в классе пользователя, definine в announcements отношение так:

public function announcements() { 
    return $this->hasManyThrough(Announcement::class,ActiveAnnouncement::class); 
} 

Вы можете получить доступ объявления пользователя с announcement:

@if (Auth::user()->announcements()->count() > 0) 
    @foreach(Auth::user()->announcements as $announcement) 
     //code to display announcement 
    @endforeach 
@endif 

Nota: Может быть, вы могли бы просто добавить столбец is_active в объявлении и падение ActiveAnnouncement модели.Таким образом, определить announcements отношений в классе User:

в классе пользователе, definine в announcements отношения так:

public function announcements() { 
    return $this->hasMany(Announcement::class); 
} 

и доступ активных объявлений через:

$activeAnnouncements = $user->announcements()->whereIsActive(true)->get() 

Надеется, что это help

Смежные вопросы