在 Laravel Eloquent 中使用“with()”函数连接列
Concat columns using “with()” function in 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');
在我的 person class
我有这个方法:
public function User()
{
return $this->hasOne('User');
}
在我的 user class
我有这个:
public function Person()
{
return $this->belongsTo('Person', 'person_id');
}
我收到以下错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list' (SQL: select `name`, `id` from `prefix_user`)
当我尝试时
$user = User::with(array('Person'=>function($query){
$query->selectRaw('CONCAT(prefix_person.name, " - ", prefix_user.code) as name, prefix_user.id')->lists('name', 'id');
}));
我收到这个错误:
我已经使用了几次 selectRaw
,但从来不需要将其与(连接)结合使用。
问题是 Eloquent 将首先查询用户 table,然后才查询人员 table,因此一个查询不知道另一个,因此连接将不工作。
您可以使用 Query Builder 使用 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');
编辑:
并且,正如@michel-ayres 评论所建议的,只要您拥有该领域的访问者:
public function getFullNameAttribute() {
return $this->attributes['name'] . ' - ' . $this->attributes['code'];
}
您可以使用自己的模型来执行连接和列表:
User::join('person','person.id','=','user.person_id')
->select('person.name', 'user.code', 'user.id')
->get()
->lists('full_name', 'id');
使用简单的查询就可以解决,
User::join('persons as p', 'p.id', '=', 'users.person_id')
->get([
'id',
DB::raw('CONCAT(p.name,"-",users.code) as name')
])
->lists('name', 'id');
或者,换个方式看
User::join('persons as p', 'p.id', '=', 'users.person_id')
->select(
'id',
DB::raw('CONCAT(p.name,"-",users.code) as name')
)
->lists('name', 'id');
我正在尝试 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');
在我的 person class
我有这个方法:
public function User()
{
return $this->hasOne('User');
}
在我的 user class
我有这个:
public function Person()
{
return $this->belongsTo('Person', 'person_id');
}
我收到以下错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list' (SQL: select `name`, `id` from `prefix_user`)
当我尝试时
$user = User::with(array('Person'=>function($query){
$query->selectRaw('CONCAT(prefix_person.name, " - ", prefix_user.code) as name, prefix_user.id')->lists('name', 'id');
}));
我收到这个错误:
我已经使用了几次 selectRaw
,但从来不需要将其与(连接)结合使用。
问题是 Eloquent 将首先查询用户 table,然后才查询人员 table,因此一个查询不知道另一个,因此连接将不工作。
您可以使用 Query Builder 使用 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');
编辑: 并且,正如@michel-ayres 评论所建议的,只要您拥有该领域的访问者:
public function getFullNameAttribute() {
return $this->attributes['name'] . ' - ' . $this->attributes['code'];
}
您可以使用自己的模型来执行连接和列表:
User::join('person','person.id','=','user.person_id')
->select('person.name', 'user.code', 'user.id')
->get()
->lists('full_name', 'id');
使用简单的查询就可以解决,
User::join('persons as p', 'p.id', '=', 'users.person_id')
->get([
'id',
DB::raw('CONCAT(p.name,"-",users.code) as name')
])
->lists('name', 'id');
或者,换个方式看
User::join('persons as p', 'p.id', '=', 'users.person_id')
->select(
'id',
DB::raw('CONCAT(p.name,"-",users.code) as name')
)
->lists('name', 'id');