模型ID被相关模型覆盖

时间:2015-11-03 13:59:10

标签: php laravel eloquent

我有一个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

的行

有没有办法解决这个问题?

2 个答案:

答案 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;
}