查询条件关联

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');
    }]);
}