在Laravel Eloquent中使用"with()"函数的Concat列

Mic*_*res 6 php sql select laravel eloquent

我试图Concat的两个不同表中的列到一个单独的列.

$user = User::with(array('Person'=>function($query){
    $query->selectRaw('CONCAT(prefix_person.name, " - ", prefix_user.code) as name, prefix_user.id');
}))->lists('name', 'id');
Run Code Online (Sandbox Code Playgroud)

在我的person class我有这个方法:

public function User()
{
    return $this->hasOne('User');
}
Run Code Online (Sandbox Code Playgroud)

在我的user class我有这个:

public function Person()
{
    return $this->belongsTo('Person', 'person_id');
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list' (SQL: select `name`, `id` from `prefix_user`)
Run Code Online (Sandbox Code Playgroud)

当我尝试

$user = User::with(array('Person'=>function($query){
    $query->selectRaw('CONCAT(prefix_person.name, " - ", prefix_user.code) as name, prefix_user.id')->lists('name', 'id');
}));
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

错误


我已经使用了selectRaw几次,但从来没有把它变成一个with(join).

Rav*_*afi 9

问题在于,Eloquent将首先查询users表,并且仅在查询人员表之后,因此一个查询不知道另一个查询,因此连接将不起作用.

您可以使用查询生成器来执行此操作join.它会是这样的:

$user = DB::table('users as u')
    ->join('persons as p', 'p.id', '=', 'u.person_id')
    ->selectRaw('CONCAT(p.name, " - ", u.code) as concatname, u.id')
    ->lists('concatname', 'u.id');
Run Code Online (Sandbox Code Playgroud)

编辑:并且,正如@ michel-ayres评论所建议的那样,只要你有一个领域的进步者:

public function getFullNameAttribute() { 
    return $this->attributes['name'] . ' - ' . $this->attributes['code'];
}
Run Code Online (Sandbox Code Playgroud)

您可以使用自己的模型来执行连接和列表:

User::join('person','person.id','=','user.person_id')
    ->select('person.name', 'user.code', 'user.id')
    ->get()
    ->lists('full_name', 'id');
Run Code Online (Sandbox Code Playgroud)