Laravel使用pluck方法与concat函数的用法

28

我正在使用Laravel 5.3。以下是我的查询。

$ProjectManagers = Employees::where("designation" , 1)
->pluck(DB::raw('CONCAT(first_name," ",last_name) AS name'),'id');

引发以下错误:

在isset或empty中使用了非法偏移量类型

请问这是正确的方法吗?

如果我不使用contact而是使用类似的方法会怎样呢?

$ProjectManagers = Employees::where("designation" , 1)->pluck('first_name','id');

它正在正确运行并给我结果

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [8] => Punit
        )

)

期望结果:

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [8] => Punit Gajjar
        )

)

将名字和姓氏拼接在一起。


->pluck('first_name','id'); 更改为 ->pluck('name','id'); - martincarlin87
@martincarlin87: SQLSTATE[42S22]: 列不存在:1054 在字段列表中未知的列 'name' - Punit Gajjar
2
嗯,这只是我想到的一个猜测,我想name肯定要在里面,因为这是在查询中使用的别名。我能想到的另一件事就是$ProjectManagers = Employees::select([DB::raw("CONCAT(first_name," ",last_name) AS name")])->where('designation', 1)->pluck('name', 'id');。我没有使用过pluck,所以不确定是否可以请求多个列,另一种选择似乎是使用->only("id", "name")->toArray() - martincarlin87
2
是的,它有效,谢谢。正确的代码是 $ProjectManagers = Employees::select(DB::raw("CONCAT(first_name,' ',last_name) AS name"),'id')->where('designation', 1)->pluck('name', 'id'); - Punit Gajjar
4个回答

59
最优雅的解决方案是创建一个访问器(accessor)
打开你的Employees类(模型)并添加一个访问器函数:
public function getFullNameAttribute()
{
    return $this->first_name . ' ' . $this->last_name;
}

然后,只需简单地使用:

$ProjectManagers = Employees::where('designation', 1)->get()->pluck('full_name', 'id');

1
太棒了!值得注意的是(也许只是我的愚蠢),要使用mutator访问所有记录,您必须编写Employees :: all()->pluck('full_name','id')。请注意all()。我否定了它,因为我没有一个良好的子句,但Laravel在第一次调用时查询数据库,导致它搜索full_name - JustCarty
很好地使用了getFooAttribute()访问器。 - Samuel Shifterovich
2
这是最好的解决方案。 - gX.
哇!令人印象深刻。这对我有效,我感觉非常优雅! - sgtcoder
只要你的数据库中只有几百条记录,这是一个不错的解决方案。对于成千上万条记录来说,这需要很长时间。表现良好的解决方案是那些不使用访问器,而是在数据库层面上使用concat()函数的解决方案。 - TeeJay
3
注意在使用pluck时通常不需要使用get()调用。 - alex toader

58
尝试将优雅的查询更改为:
$ProjectManagers = Employees::select(
            DB::raw("CONCAT(first_name,' ',last_name) AS name"), 'id')
            ->where('designation', 1)
            ->pluck('name', 'id');

4

如果您的列是可空的,则应尝试此方法

使用 COALESCENULL 值转换为空字符串

$ProjectManagers = Employees::select(
            DB::raw("CONCAT(COALESCE(`first_name`,''),' ',COALESCE(`last_name`,'')) AS name"),'id')
            ->where('designation', 1)
            ->pluck('name', 'id')
            ->toArray();

3

我也遇到过这样的连接查询问题,这是我的解决方案

$studentDegree = Student::leftJoin('degree','degree.student_id','=','student.id')
->select(
      DB::raw("CONCAT(student.name,'-',degree.name) AS name_degree"),
      'student.id'
)->lists('name_degree','id');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接