【问题标题】:Eloquent Relation Filtering雄辩的关系过滤
【发布时间】:2013-06-19 21:15:10
【问题描述】:

是否可以通过相关模型过滤 Laravel 的 Eloquent ORM 中的结果集?我知道 Eloquent 不会加入表格,但我想要的结果类似于:

选择 * 来自门票 在tickets.status_id = statuses.id 上加入状态 WHERE statuses.name != 'Closed';

我在 Eloquent 中找到的最接近的功能是:

$tickets = Ticket::with(array('status' => function($q) {
    return $q->where('name', '!=', 'Closed');
}))->get();

如果名称未关闭,这仍将返回所有票证,但仅返回状态关系。

另外,我知道这可以在 Fluent 中完成,但我想使用 Eloquent 提供的嵌套对象的返回结构:

echo ticket->status->name;

Fluent 会像连接查询一样返回扁平化结果。

【问题讨论】:

    标签: orm laravel laravel-4 eloquent


    【解决方案1】:

    另一种干净的方法是为 已关闭 票证创建单独的关系

    票证模型

    内部的关系
    //get tickets that are not Closed
    public function openTickets()
    {
        return $this->hasMany('App\Models\Status')->where('name','!=','Closed');
    }
    

    用法

    $tickets = Ticket::with('openTickets')->get();
    

    【讨论】:

      【解决方案2】:

      这个问题似乎很老了,但如果你在这里寻找一个真正的答案,我们应该尽量避免查询数据库太多,接受的答案做两次,但你可以通过像这样拍一张

      $tickets = Ticket::with('status')->whereHas('status', function($q) {
          return $q->where('name', '!=', 'Closed');
      })->get();
      

      【讨论】:

        【解决方案3】:

        尝试将查询范围添加到您的模型关系中。 Laravel. Use scope() in models with relation

        Laravel 4.2+

        【讨论】:

          【解决方案4】:

          您可以在模型中覆盖 newQuery,以便将附加查询应用于所有 get() 方法 - 请参阅 http://usman.it/filter-eloquent-results-overriding-laravel/

          【讨论】:

            【解决方案5】:

            我觉得我试图让它变得过于复杂。

            $statuses = Status::where('name', '!=', 'Closed')->list('id');
            $tickets = Ticket::with('status')->whereIn('status_id', $statuses)->get();
            

            或者,我可以采用 Statuses 的方向......我真的不想这样做,但它会减少我的查询数:

            $statusTickets = Status::with('ticket')->where('name', '!=', 'Closed')->get();
            

            【讨论】:

              【解决方案6】:

              您也许可以在模型中定义 hasOne('status') 关系并使用它 但我个人并没有尝试这样做。

              【讨论】:

              • 工单属于一个状态,因为工单有一个 status_id。状态有很多票。
              猜你喜欢
              • 1970-01-01
              • 2020-09-29
              • 1970-01-01
              • 2015-01-29
              • 1970-01-01
              • 1970-01-01
              • 2021-12-15
              相关资源
              最近更新 更多