Laravel全局范围和多个连接

时间:2016-04-27 07:53:18

标签: php eloquent laravel-5.2

由于需要内容本地化,每个可本地化模型的数据被分成2个表,包括基本和可本地化的字段。所以我添加了全局范围和连接代码清除。但是现在,如果我正在尝试加入另一个本地化表,我会收到此错误。

Undefined table: 7 ERROR: missing FROM-clause entry for table "posts"

麻烦代码:

$news = Post::orderIdDesc()
            ->innerJoin('organizations', 'organization','id')
            ->where('posts.organization', '=', $orgId)
            ->select('*')
            ->take(3)
            ->get();

返回此sql:

select * from "posts_uk"
  inner join "organizations" on "posts"."organization" = "organizations"."id"
  inner join "organizations_uk" on "organizations_uk"."id" = "organizations"."id"
  inner join "posts" on "posts_uk"."id" = "posts"."id"
where "posts"."organization" = 1
order by "posts_uk"."id" desc limit 3

正如您所看到的,Post模型的其他部分加入了全局范围,在查询结束时附加,导致提到的错误。

也许有一些方法可以让全局范围在开头加上它的加入,或任何其他适用的分辨率。

THX

2 个答案:

答案 0 :(得分:0)

没有正式的方法将全局范围置于开头,但您可以在全局范围内手动反转连接。它有点hacky但应该工作:

public function apply($builder, $model)
{
   $builder->join(...);
   $builder->join(...);

   // remove the join clauses from the end of the query
   $query = $builder->getQuery();
   $join2 = array_pop($query->joins);
   $join1 = array_pop($query->joins);

   // and merge them back at the beginning
   $query->joins = array_merge([$join1, $join2], $query->joins);
}

答案 1 :(得分:0)

升级到Laravel 5.3时遇到同样的问题。我的全局范围的连接是最后一次连接,而不是第一次连接。根据Anze的回答,我添加了方法:

protected function popShiftLastJoin(Builder $builder) {
    $query = $builder->getQuery();
    $join = array_pop($query->joins);
    array_unshift($query->joins, $join);
}

然后在您应该首先加入的范围中的任何连接之后调用该方法:

public function apply(Builder $builder, Model $model) {
   $builder->join(...);
   $this->popShiftLastJoin($builder);
}