2013-12-17 3 views
3

Теория:Доступ к информации о сводных таблицах

Пользователи могут посещать множество мероприятий, и многие мероприятия могут посещать многие пользователи. Таким образом, у меня есть два отношения «многие ко многим» в моих моделях, привязанные к сводной таблице (event_user). При посещении каждого события я хочу иметь доступ к данным сводной таблицы (event_user), чтобы узнать, уже ли они посещают.

event_user: --id --event_id --user_id

Например, мои данные семена:

пользователя 1 посещение как событие 2 и 3. Я хочу, чтобы иметь возможность показать это в представлении.

Ближайший у меня есть (логически):

public function index() 
{ 
    $id = Auth::user()->id; 
    $attending = myApp\Event::find($id)->event; 
    var_dump($attending); **But this var_dump returns NULL, but $id returns the correct ID.** 

    $events = myApp\Event::all(); 
    $this->layout->content = View::make('events.index')->with('events', $events); 
} 

Моя цель состоит в том, чтобы отключить кнопку «ПРИСУТСТВУЙТЕ», на любом мероприятии, где они уже лечащие, только оставив ПРИСУТСТВУЙТЕ-состояние события доступны !

Любая помощь была бы чрезвычайно оценена. Заранее спасибо.

Любой дополнительный код, который вы можете найти необходимо:

События Модель: Модель

<?php 

namespace myApp; 
use Eloquent; 

class Event extends Eloquent { 

    public function consultant() 
    { 
     return $this->belongsToMany('myApp\Consultant'); 
    } 

    public function location() 
    { 
     return $this->belongsToMany('myApp\Location'); 
    } 

    public function user() 
    { 
     return $this->belongsToMany('myApp\User'); 
    } 

} 

Пользователь:

<?php 

namespace myApp; 
use Eloquent; 

use Illuminate\Auth\UserInterface; 
use Illuminate\Auth\Reminders\RemindableInterface; 

class User extends Eloquent implements UserInterface, RemindableInterface { 

    public function event() 
    { 
     return $this->belongsToMany('Event'); 
    } 

    public function practice() 
    { 
     return $this->belongToMany('Practice'); 
    } 

index.blade.php (с указанием список событий)

<div class="panel panel-success"> 
    <!-- Default panel contents --> 
    <div class="panel-heading"><strong>Events</strong></div> 
    <!-- <div class="panel-body"> 
    </div> --> 

    <!-- Table --> 
    <table class="table"> 
    <thead> 
    <tr> 
     <th>Title</th> 
     <th>Date</th> 
     <th>Presenter</th> 
     <th>Location</th> 
     <th></th> 
    </tr> 
    </thead> 
    <tbody> 
     @foreach($events as $event) 
     <tr> 
      <td>{{ $event->title }}</td> 
      <td>{{ date("j F Y", strtotime($event->date)) }}</td> 
      <td>{{ $event->consultant()->first()->title }} {{ $event->consultant()->first()->surname }}</td> 
      <td>{{ $event->location()->first()->address_1 }}</td> 
      <td><button type="button" class="btn btn-info">Attend</button></td> 
     </tr> 
     @endforeach 
    </tbody> 
    </table> 
</div> 

</table> 

ответ

3

Я думаю, вы идете по этому неправильно, это или я неправильно понял.

Во-первых, вы пытаетесь найти событие с тем же первичным ключом, что и текущий аутентифицированный пользователь, что неверно, хотя это легкое отверстие для падений.

$id = Auth::user()->id; 
$attending = myApp\Event::find($id)->event; 
// equivalent of: SELECT * FROM `events` WHERE `id` = ? 

Вместо этого вы будете хотеть сделать это

$id = Auth::user()->id; 
$attending = myApp\Event::where('user_id', $id)->get(); 
// equivalent of: SELECT * FROM `events` WHERE `user_id` = ? (user_id insted of events.id) 

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

$user = Auth::user(); 
$attending = $user->event; 

Для того, чтобы это еще один шаг вперед, и сделать так, что вы можете проверить внутри цикла Еогеасп, вы можете расширенный код выше, чтобы выглядеть следующим

$user = Auth::user(); 
$attending = $user->event->lists('id'); 

Это сделает массив идентификаторов из возвращенных событий, которые вам необходимо назначить зрения

$this->layout->content = View::make('events.index', array('events' => $events, 'attending' => $attending)); 

Теперь вы можете свободно получить доступ к нему в вашем Еогеасп

@foreach($events as $event) 
<tr> 
    <td>{{ $event->title }}</td> 
    <td>{{ date("j F Y", strtotime($event->date)) }}</td> 
    <td>{{ $event->consultant()->first()->title }} {{ $event->consultant()->first()->surname }}</td> 
    <td>{{ $event->location()->first()->address_1 }}</td> 
    <td> 
    @if (!in_array($event->id, $attending)) 
     <button type="button" class="btn btn-info">Attend</button> 
    @endif 
    </td> 
</tr> 
@endforeach 

Кроме того, видя, как событие является зарезервированным Алиас (если вы не изменили конфиг, который я бы не рекомендовал), вы хотите, чтобы указать пространство имен в декларации отношения внутри пользователя

public function event() 
{ 
    return $this->belongsToMany('myApp\Event'); 
} 

В качестве последнего момента это не проблема как таковая, но в моем собственном коде я пытаюсь назвать отношения, которые могут возвращать несколько объектов во множественном числе, поэтому это будет public function events();.

+0

Какое замечательное объяснение, я не могу вас отблагодарить (это ясно для начинающего, как я!) Пространство имен было слабым с моей стороны, мое плохое. Использование события $ attending = $ user->; возвращает все в JSON .. Включая все данные о пользователе, хешированный пароль и т. Д. Однако, вовремя, я пытался решить это сам и это, казалось, привело к двум правильным событиям, которые пользователь посещает: $ attending = myApp \ Event :: has ('user') -> get(); Но я теперь изо всех сил пытаюсь сопоставить их в цикле foreach моего взгляда, чтобы пересечь матч, независимо от того, посещают ли они! – Ben

+0

Без проблем, я рад, что это помогло. Проблема с '$ attending = myApp \ Event :: has ('user') -> get();' заключается в том, что она вернет события, у которых есть соответствующий пользователь, даже если пользователь не является текущим. Если вы повторяете содержимое $ attending, то Laravel автоматически сделает его строкой JSON, вместо этого используйте 'dd ($ attending);'. – ollieread

+0

Я изменил свой ответ, чтобы включить способ его проверки – ollieread

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