我们正在构建一个门户,将第一部分现有应用程序替换为第一步,但数据库架构完全没有约定。除了缺少任何约束,索引等之外,列的名称不是描述性的,也不是蛇形的。
是否可以映射数据库表列名,以便门户网站使用正确的描述性和蛇形列名称,如first_name
,但写入实际数据库列first
至少使门户网站成为清理科技债务的第一步是什么?
例如,类似于如果表名不遵循惯例,可以如何设置表名(Model::table
):
示例
private $columns = [
// convention => actual
'first_name' => 'first',
'last_name' => 'last',
'mobile_phone' => 'phone',
'home_phone' => 'otherPhone', // seriously!?
];
我已经查看了Model
和HasAttributes
这一特性,但我仍然希望这可能存在,或者有人找到了办法将其作为临时解决方案
答案 0 :(得分:1)
正确的方法是使用accessors and mutators。
定义访问者
public function getFirstNameAttribute() {
return $this->first;
}
然后,您可以按$model->first_name
访问该值。
定义变异者
public function setFirstNameAttribute($value) {
$this->attributes['first'] = $value;
}
然后,您可以改变值,例如:
$model->first_name = 'first_name';
$model->save();
答案 1 :(得分:1)
您可以为所有模型创建父类:
abstract class Model extends \Illuminate\Database\Eloquent\Model {
protected $columns = [];
public function attributesToArray()
{
$attributes = parent::attributesToArray();
foreach ($this->columns as $convention => $actual) {
if (array_key_exists($actual, $attributes)) {
$attributes[$convention] = $attributes[$actual];
unset($attributes[$actual]);
}
}
return $attributes;
}
public function getAttribute($key)
{
if (array_key_exists($key, $this->columns)) {
$key = $this->columns[$key];
}
return parent::getAttributeValue($key);
}
public function setAttribute($key, $value)
{
if (array_key_exists($key, $this->columns)) {
$key = $this->columns[$key];
}
return parent::setAttribute($key, $value);
}
}
然后在模型中覆盖$columns
:
protected $columns = [
'first_name' => 'first',
'last_name' => 'last',
'mobile_phone' => 'phone',
'home_phone' => 'otherPhone',
];