访问和显示数据透视表数据

时间:2013-12-17 20:27:53

标签: laravel many-to-many laravel-4 pivot-table

理论值:

用户可以参加许多活动,许多用户可以参加许多活动。因此,我的模型中有两个多对多关系,链接到数据透视表(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>

1 个答案:

答案 0 :(得分:2)

我认为你是以错误的方式解决这个问题,或者我误解了。

首先,您尝试使用与当前经过身份验证的用户相同的主键查找事件,这是不正确的,尽管这是一个容易陷入的漏洞。

$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)

话虽如此,只需在auth用户上调用event属性即可访问用户事件吗?

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

为了更进一步,并使其能够在foreach循环中进行检查,您可以将上述代码推进为如下所示

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

这将从您需要分配给视图的返回事件中生成一个id数组

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

现在您可以在foreach中自由访问它了

@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

另外,看到Event是一个保留的别名(除非你修改了我不推荐的配置),你需要在User

中的关系声明中指定命名空间。
public function event()
{
    return $this->belongsToMany('myApp\Event');
}

最后一点,这不是问题,但在我自己的代码中,我尝试命名有可能以复数形式返回多个对象的关系,因此它将是public function events();