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

Posted

技术标签:

【中文标题】laravel 雄辩的采摘与原始 concat 的奇怪行为【英文标题】:Weird behaviour in laravel eloquent pluck with raw concat 【发布时间】:2017-05-31 01:46:16 【问题描述】:

我有以下正在工作的 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';


【问题讨论】:

【参考方案1】:

我认为,您在 pluck 中的原始查询是指一个对象。所以,什么时候尝试获取索引为对象的元素已经显示错误了。

你应该把你的查询改成这样:

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

这会奏效。希望对你有帮助

【讨论】:

很高兴看到它对您有所帮助 快速参考:laravel.com/api/5.4/Illuminate/Database/Eloquent/… 它显示: Collection pluck(string $column, string|null $key = null) 所以 $column 必须是字符串而不是对象。很好地抓住了那个 Sagar。 @RaviGehlot 谢谢我几天前也遇到了同样的问题【参考方案2】:

无需使用 DB::raw 和 MySQL 的 concat_ws 即可获得相同结果的另一种方法是使用 Laravel 的访问器。比如:

在您的 Timezone 模型上,创建如下访问器方法:

public function getLabelAttribute($value)

    return $value . ' ' . $this->name;

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

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

【讨论】:

当我们在原始 sql 上有太复杂的东西时,这个会更好

以上是关于laravel 雄辩的采摘与原始 concat 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Group_concat - laravel 雄辩

将原始查询转换为雄辩的 laravel

将原始联合查询转换为雄辩的关系

Laravel:自我 JOIN 的雄辩查询

将原始查询添加到雄辩的关系

Laravel 雄辩与条件