Laravel 属性访问器大写字母被忽略
Laravel attribute accessor capital letter is ignored
我正在使用 Lumen
框架。我有一个问题,我需要为属性设置自定义访问器,但问题是数据库中的列以大写字母开头。
例如 Logo
。并且在第一个大写字母的情况下,检索对象时不会调用访问器,我尝试了几个列,名称从小写字母开始的列效果很好。
public function getLogoAttribute($value)
此访问器不起作用,因为列的名称是 Logo
我无法更改数据库中列的名称,但需要在我的应用程序中使用访问器。
我知道我可以更改 Eloquent
框架的来源,但也许还有其他方法可以让它工作。
谢谢。
我花了好几个小时在网上寻找答案,但后来决定自己在代码中找到这部分。
我找到了。
位于vendor/illuminate/database/Eloquent/Model
方法 public function attributesToArray()
把这个方法的部分修改成这样
$mutatedAttributes = $this->getMutatedAttributes();
// We want to spin through all the mutated attributes for this model and call
// the mutator for the attribute. We cache off every mutated attributes so
// we don't have to constantly check on attributes that actually change.
foreach ($mutatedAttributes as $key) {
if (! array_key_exists($key, $attributes) ) {
if(array_key_exists(ucfirst($key), $attributes)) {
$key = ucfirst($key);
}
else {
continue;
}
}
如果列名中有多个大写字母,这将不起作用。
这个问题的糟糕解决方案,只需根据约定命名数据库列,就不会有任何问题(在我的情况下我可以更改列名)。
更新
你也可以这样修改class
/**
* Indicates if the model mutated attributes can have different case from ex. User_comments instead of user_comments.
*
* @var bool
*/
public $upperCaseMutatedAttributes = false;
if($this->upperCaseMutatedAttributes && array_key_exists(ucfirst($key), $attributes)) {
$key = ucfirst($key);
}
您可以在 class 中覆盖此变量。
我喜欢这个
protected $appends = ['image'];
public function getImageAttribute(){
$img = null;
$value = $this->attributes['Image'];
if ($value) {
if (strpos($value, 'baseurl') !== false) {
$img = $value;
} else {
$img = 'prefixurl' . $value;
}
}
return $img;
}
我正在使用 Lumen
框架。我有一个问题,我需要为属性设置自定义访问器,但问题是数据库中的列以大写字母开头。
例如 Logo
。并且在第一个大写字母的情况下,检索对象时不会调用访问器,我尝试了几个列,名称从小写字母开始的列效果很好。
public function getLogoAttribute($value)
此访问器不起作用,因为列的名称是 Logo
我无法更改数据库中列的名称,但需要在我的应用程序中使用访问器。
我知道我可以更改 Eloquent
框架的来源,但也许还有其他方法可以让它工作。
谢谢。
我花了好几个小时在网上寻找答案,但后来决定自己在代码中找到这部分。
我找到了。
位于vendor/illuminate/database/Eloquent/Model
方法 public function attributesToArray()
把这个方法的部分修改成这样
$mutatedAttributes = $this->getMutatedAttributes();
// We want to spin through all the mutated attributes for this model and call
// the mutator for the attribute. We cache off every mutated attributes so
// we don't have to constantly check on attributes that actually change.
foreach ($mutatedAttributes as $key) {
if (! array_key_exists($key, $attributes) ) {
if(array_key_exists(ucfirst($key), $attributes)) {
$key = ucfirst($key);
}
else {
continue;
}
}
如果列名中有多个大写字母,这将不起作用。
这个问题的糟糕解决方案,只需根据约定命名数据库列,就不会有任何问题(在我的情况下我可以更改列名)。
更新
你也可以这样修改class
/**
* Indicates if the model mutated attributes can have different case from ex. User_comments instead of user_comments.
*
* @var bool
*/
public $upperCaseMutatedAttributes = false;
if($this->upperCaseMutatedAttributes && array_key_exists(ucfirst($key), $attributes)) {
$key = ucfirst($key);
}
您可以在 class 中覆盖此变量。
我喜欢这个
protected $appends = ['image'];
public function getImageAttribute(){
$img = null;
$value = $this->attributes['Image'];
if ($value) {
if (strpos($value, 'baseurl') !== false) {
$img = $value;
} else {
$img = 'prefixurl' . $value;
}
}
return $img;
}