【问题标题】:complex join clause in Laravel EloquoentLaravel Eloquent 中的复杂连接子句
【发布时间】:2017-10-16 09:07:30
【问题描述】:

我有三张桌子:A、B 和 C。

表 A:

  • 身份证
  • B_id
  • 价值

表 B:

  • 身份证
  • C_id
  • 公司

表 C:

  • 身份证
  • 状态

现在,我想使用 Eloquent 关系执行以下查询。

select * from A, B, C where A.B_id = B.id and B.C_id = C.id and C.state = 1

我标记了每个模型中的关系并执行了以下查询:

A::with(['b' => function($query) { 
    $query->with(['C'=> function($q) {
        $q->where('state', 1);
    }]);
}])->get();

但是,我没有得到预期的结果。

我在这里错过了什么?

【问题讨论】:

  • 在这里发布您的关系。
  • 我们停止使用逗号连接语法 ca。 1992 :-(
  • 你得到了什么结果?数据库中有哪些数据?

标签: php mysql database laravel laravel-5.5


【解决方案1】:

当您将with 与范围一起使用时,您只会过滤关系,而不是您要查询的顶级模型。您通常必须同时进行查询和范围 with。

例子:

A::query()
    ->whereHas('b.c', function ($q) {
        $q->where('state', 1);
    })
    ->with([
        'b.c' => function ($q) {
            $q->where('state', 1);
        },
    ])->get();

【讨论】:

    【解决方案2】:

    试试这个:

    A::join('B', 'B.id', '=', 'A.B_id')
     ->join('C', 'C.id', '=', 'B.C_id')
     ->select(...)
     ->where('C.state', 1)
     ->get();
    

    在选择方法中,您可以指定要选择每个表的哪个字段,例如:

    ->select('A.*', 'B.company', 'C.state')
    

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 2015-07-14
      • 2017-04-17
      • 2014-08-18
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2014-10-18
      相关资源
      最近更新 更多