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