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 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章