Laravel自定义列,嵌套关系

时间:2016-08-26 05:54:17

标签: laravel laravel-5

我有这个型号:

案例:

class Cases extends Model {
    const UPDATED_AT = 'edit_date';
    const CREATED_AT = 'crt_date';

    protected $primaryKey = 'no';
    protected $guarded = ['no'];
    protected $table = 'assist';

    public function providers() {
        return $this->hasMany('App\CaseProviders', 'case_no');
    }

    public function claims() {
        return $this->hasMany('App\Claim', 'reference_no');
    }

}

CaseProviders:

class CaseProviders extends Model {

    public function detail() {
        //return $this->hasOne('App\Providers', 'code', 'code')->select(['code', 'name']);
        return $this->hasOne('App\Providers', 'code', 'code');
    }

}

提供商:

class Providers extends Model {

    protected $table = 'user_cards';

    public function country() {
        return $this->hasOne('App\Country','id','country');
    }


}

国家:

class Country extends Model {

    protected $primaryKey = 'id';
    protected $table = 'user_countries';

    public function city() {
        return $this->hasMany('App\City', 'country', 'id');
    }

}

城市:

class City extends Model
{
    protected $table = 'user_cities';
}

和控制器中的代码:

$case = \App\Cases::where('no', $id)->with('providers.detail.country.city')->first();

代码工作正常,但我不需要从每个模型中选择所有列。我只需要这个:

名称,代码 - 来自详细信息

名称 - 来自国家/地区

名称 - 来自城市。

我怎么做?

1 个答案:

答案 0 :(得分:0)

我还没有对此进行测试,由于嵌套关系,它可能会提出更多查询,但无论如何,尝试它会不会受到伤害:

    $case = \App\Cases::where('no', $id)->with([
        'providers.detail' => function ($query){
            $query->select('name', 'code');
        },
        'providers.detail.country' => function ($query){
            $query->select('name');
        },
        'providers.detail.country.city' => function ($query){
            $query->select('name');
        },
    ])->first();

修改

如果您只需要在模型中直接选择具有关系的这些字段:

public function country() {
    return $this->hasOne('App\Country','id','country')->select(['name']);
}

注意 您必须包含 id 列和外部ID列。