Laravel 4 使用hasManyThrough和Laravel 4.1快速加载
我有以下表格结构Laravel 4 使用hasManyThrough和Laravel 4.1快速加载,laravel-4,Laravel 4,我有以下表格结构 users user_id | email | name ================================== 1 | tom@example.org | Tom 2 | pete@example.org | Pete trainings training_id | user_id | title ================================================= 1
users
user_id | email | name
==================================
1 | tom@example.org | Tom
2 | pete@example.org | Pete
trainings
training_id | user_id | title
=================================================
1 | 1 | First training of Tom
2 | 1 | Second training of Tom
3 | 2 | First training of Pete
4 | 2 | Second training of Pete
calendar
calendar_id | training_id | when_date
=================================================
1 | 1 | 2014-08-01 10:00:00
2 | 1 | 2014-08-08 10:00:00
3 | 1 | 2014-08-15 10:00:00
4 | 2 | 2014-08-01 18:00:00
5 | 2 | 2014-08-03 18:00:00
6 | 2 | 2014-08-05 18:00:00
7 | 3 | 2014-08-12 16:30:00
8 | 4 | 2014-08-09 22:30:00
我为这个桌子结构准备了三个模型
class User extends Eloquent
{
public function trainings()
{
return $this->hasMany('Training');
}
public function events()
{
return $this->hasManyThrough('Calendar', 'Training', 'user_id', 'training_id');
}
}
class Training extends Eloquent
{
public function user()
{
return $this->belongsTo('User');
}
public function events()
{
return $this->hasMany('Calendar');
}
}
class Calendar extends Eloquent {
public function training()
{
return $this->belongsTo('Training');
}
}
我想为所选用户(user\u id=1
)获取最新的N个日历事件,按最接近的事件排序,并包含此日历事件的所有培训详细信息。当我执行以下操作时,急切的加载似乎不起作用
$events = User::with('events', 'trainings')->find($userId);
foreach ($events as $event) {
echo $event->training->title; // runs a separate query to get the title of the training
}
如果给定用户有100多个事件,它将运行100多个查询
如何通过快速加载实现这一点?您不应该先获取用户,然后通过该实例进行查询吗
$user = User::find(userId);
$events = $user->with('events', 'trainings');
或一次性:
User::find(userId)->with('events', 'trainings');
您可以通过使用惰性急切加载来实现这一点。就你而言:
$user = User::with('events')->find($userId);
$user->events->load('training');
foreach ($user->events as $event) {
echo $event->training->title;
}
我对你发布的代码有点困惑。
$events
是否包含用户的实例化?