我有一个Eloquent模型,它有一个范围方法来过滤某些行:
class TODocs extends \Eloquent {
public function scopeUnexported($query)
{
$query
->join('to_requests', function ($join) {
$join->on('to_requests.id', '=', 'to_docs.request_id');
$join->whereNull('to_requests.deleted_at');
})
->where('to_docs.export_allowed', true)
->whereNotNull('to_docs.filename')
->whereNull('to_docs.exported_at');
return $query;
}
}
但是当我得到该范围的结果时,所有对象都具有来自to_requests
表的id的id。
例如,如果我尝试从具有to_docs
的{{1}}表中获取一行并且此行具有外键id = 1
,那么我获得的模型的ID也是2但是,当我从范围方法中移除to_docs.request_id = 2
部分而不是像魅力一样时,join
就是1
我可能可以摆脱id
但是我需要这个条件来获取外部记录有join
有没有办法解决这个问题?
答案 0 :(得分:0)
这不是严格意义上的Laravel问题(或解决方案),因为这是mysql查询覆盖空连接字段的默认行为。另请参阅提供查询解决方案的此答案Join - fields in table 2 override those in table 1。更好,更Laravelish的方式是使用急切加载(特别是因为你似乎没有使用连接数据进行排序)。见http://laravel.com/docs/5.1/eloquent-relationships#eager-loading
答案 1 :(得分:0)
我终于解决了这个问题。我知道问题在于加入;但是,我无法删除它,因为我需要在连接表中引用字段值。所以我添加\Illuminate\Database\Query\Builder::select
来仅从主表中获取字段
public function scopeUnexported($query)
{
$query
->select('to_docs.*')
->join('to_requests', function ($join) {
$join->on('to_requests.id', '=', 'to_docs.request_id');
$join->whereNull('to_requests.deleted_at');
})
->where('to_docs.export_allowed', true)
->whereNotNull('to_docs.filename')
->whereNull('to_docs.exported_at');
return $query;
}