我有两种模式:
class Table extends Eloquent {
protected $table = 'tables';
public function sessions() {
return $this->hasMany('Sessions');
}
}
class Sessions extends \Eloquent {
protected $table = 'sessions';
public function table() {
return $this->belongsTo('Table');
}
}
(我将其称为Sessions而不是Session,因为Laravel难以混淆类)。
表是指实际的餐桌,会话只是某人或某个使用它的组 所以,我来到桌子,坐下来,开始一个会议,吃饭,付钱,关闭会议和离开。然后你来坐在同一张桌子上,这对应一个新的会议。
现在,这就是我查询表格的方式:
$table = Table::where('id', '=', $id)->with('sessions')->first();
然而,我的表附带了所有相关的会话。我该如何进行查询:
- 如果表的会话已打开,则返回表+单个会话(Session.closed_at ='0000-00-00 00:00:00')。
- 如果没有打开的会话,则仅返回没有关联记录的表。
我应该如何在我的Controller和我的模型中构建这个相同的查询(例如Table :: getWithSessions($ id))。
感谢。
附录: 很快,我将有一个非常复杂的关系: 一张桌子有很多会话(只有一个是重要的,活动的一个),它有很多卡片(每个人都可以获得他们各自的卡片),这些卡片可以有很多订单。订单是卡片和商品之间的连接,指向产品或其中许多产品(例如,具有多种不同啤酒的工具包)。
我很感激有关如何与雄辩建立这种关系的任何见解,并让所有人都能很好地玩(例如能够查询表并获得与当前会话相关的所有卡的所有订单)。
答案 0 :(得分:0)
您可以使用with()
中的闭包来定义条件,从而将模型过滤为急切加载。您也可以使用find()
代替where('id',... ->first()
:
$table = Table::with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);
注意因为正常关系会返回一个集合,所以它仍然会返回一个集合。因此,在访问会话时,您需要使用:$table->sessions->first()
来获取当前会话。
要获取没有开放会话的表格,只需使用whereDoesntHave
:
$tables = Table::whereDoesntHave('sessions', function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
})->get();
对于Table::getWithSessions($id)
之类的通话,您有两种选择。
创建一个这样的静态方法:
public static function getWithSessions($id){
return static::with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);
}
使用范围,您可以执行以下操作:
Table::withOpenSessions()->find($id);
这是范围方法:
public function scopeWithOpenSessions($query){
return $query->with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}]);
}