由于需要内容本地化,每个可本地化模型的数据被分成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
答案 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);
}