在laravel雄辩的采摘与原始concat奇怪的行为

时间:2017-05-31 01:46:16

标签: php laravel orm eloquent

我有以下工作的ORM

$timezones = DB::table('timezones')->pluck(DB::Raw('concat_ws(" ",label,name) as name'), 'id');

我将其转换为

$timezones = Timezone::pluck(DB::Raw('concat_ws(" ",label,name) as name'), 'id');

并得到如下错误

ErrorException in Str.php line 432:
Illegal offset type in isset or empty

模型非常简单,如下面

class Timezone extends Model
{

     protected $table = 'timezones';
     protected $connection = 'mysql';

}

2 个答案:

答案 0 :(得分:3)

我认为,你在pluck中的原始查询是指一个对象。因此,何时尝试获取具有索引的元素作为对象错误已显示。

您应该将查询更改为以下内容:

$timezones = Timezone::select(DB::Raw('concat_ws(" ",label,name) as name'), 'id')->pluck('name','id');

这会奏效。希望它会有所帮助

答案 1 :(得分:1)

在不使用DB :: raw和MySQL的concat_ws的情况下实现相同结果的另一种方法是使用Laravel的访问器。例如:

在Timezone模型上,创建一个这样的访问器方法:

public function getLabelAttribute($value)
{
    return $value . ' ' . $this->name;
}

然后你可以通过这样做来检索它:

$timezone = Timezone::first();
$timezone->label;