查询条件关联
Conditional association on query
我有两个模型:
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 而 session 只是使用它的人或团体。
所以,我来到 table,坐下,开始 session,吃饭,付钱,关门 session 然后离开。然后你过来坐在同一个 table 上,它对应一个新的 session.
现在,这就是我查询 table:
的方式
$table = Table::where('id', '=', $id)->with('sessions')->first();
但是,我的 table 附带了所有相关的 session。我应该如何查询:
-Returns table + 单个 session 如果 table 有一个 session 是开放的(Session.closed_at = '0000- 00-0000:00:00').
-Returns table 只有在没有打开的 sessions 时才没有关联记录。
我应该如何在我的控制器和我的模型中构建这个完全相同的查询(例如 Table::getWithSessions($id))。
谢谢。
附录:
很快我就会有一个相当复杂的关系:
一个table有很多session(只有一个重要的,活跃的那个),有很多张卡(每个人都可以得到自己的卡),可以有很多订单。订单是卡片和项目之间的连接,它指向一个产品或多个产品(例如,包含几种不同啤酒的套件)。
我将不胜感激任何关于如何与 eloquent 建立这种关系并让所有人都玩得很好的见解(例如能够查询 table 并获得所有人的所有订单与当前 session).
相关的卡片
您可以通过使用 with()
中的闭包来定义您的条件来过滤模型以进行预加载。您也可以使用 find()
而不是 where('id',... ->first()
:
$table = Table::with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);
注意 因为通常关系 return 是一个集合,它仍然 return 一个。所以在访问session的时候需要使用:$table->sessions->first()
获取当前的
要在没有打开会话的情况下获取表,只需使用 whereDoesntHave
:
$tables = Table::whereDoesntHave('sessions', function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
})->get();
编辑
对于像 Table::getWithSessions($id)
这样的电话,您有两种选择。
1。静态方法
像这样创建一个静态方法:
public static function getWithSessions($id){
return static::with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);
}
2。使用 scopes
使用示波器,您可以执行以下操作:
Table::withOpenSessions()->find($id);
这是范围方法:
public function scopeWithOpenSessions($query){
return $query->with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}]);
}
我有两个模型:
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 而 session 只是使用它的人或团体。
所以,我来到 table,坐下,开始 session,吃饭,付钱,关门 session 然后离开。然后你过来坐在同一个 table 上,它对应一个新的 session.
现在,这就是我查询 table:
的方式$table = Table::where('id', '=', $id)->with('sessions')->first();
但是,我的 table 附带了所有相关的 session。我应该如何查询:
-Returns table + 单个 session 如果 table 有一个 session 是开放的(Session.closed_at = '0000- 00-0000:00:00').
-Returns table 只有在没有打开的 sessions 时才没有关联记录。
我应该如何在我的控制器和我的模型中构建这个完全相同的查询(例如 Table::getWithSessions($id))。
谢谢。
附录: 很快我就会有一个相当复杂的关系: 一个table有很多session(只有一个重要的,活跃的那个),有很多张卡(每个人都可以得到自己的卡),可以有很多订单。订单是卡片和项目之间的连接,它指向一个产品或多个产品(例如,包含几种不同啤酒的套件)。
我将不胜感激任何关于如何与 eloquent 建立这种关系并让所有人都玩得很好的见解(例如能够查询 table 并获得所有人的所有订单与当前 session).
相关的卡片您可以通过使用 with()
中的闭包来定义您的条件来过滤模型以进行预加载。您也可以使用 find()
而不是 where('id',... ->first()
:
$table = Table::with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);
注意 因为通常关系 return 是一个集合,它仍然 return 一个。所以在访问session的时候需要使用:$table->sessions->first()
获取当前的
要在没有打开会话的情况下获取表,只需使用 whereDoesntHave
:
$tables = Table::whereDoesntHave('sessions', function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
})->get();
编辑
对于像 Table::getWithSessions($id)
这样的电话,您有两种选择。
1。静态方法
像这样创建一个静态方法:
public static function getWithSessions($id){
return static::with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);
}
2。使用 scopes
使用示波器,您可以执行以下操作:
Table::withOpenSessions()->find($id);
这是范围方法:
public function scopeWithOpenSessions($query){
return $query->with(['sessions' => function($q){
$q->where('closed_at', '0000-00-00 00:00:00');
}]);
}