我遇到了Laravel Eloquent Model
的问题我有一个模型如下:
class Activity extends Eloquent {
protected $table = 'activity';
protected $timestamps = false;
public $item;
public $content;
public $year;
protected $fillable = array('item', 'content', 'year');
}
和相应的控制器:
class ActivityController extends \BaseController {
public function create()
{
$activity = new Activity();
$actitity->item = 'Example';
$activity->content = 'Example content';
$activity->year = 2015;
$activity->save();
}
}
上面的代码应该可以正常运行,并且“活动”表中应该有一条记录。但是,当我运行此代码时,活动表的列的所有值都将作为NULL插入(除了id列为auto_increment)。
此外,当我var_dump $活动时(在调用$ activity-> save()之前),具有所有属性的$ activity显示为预期(我的意思是,我之前已分配的值)
我的代码中是否有任何微妙的错误?
答案 0 :(得分:2)
您不能将数据库字段定义为实际的类属性。问题是Laravel在内部使用$attributes
数组,而不是模型属性。
做的时候
$activity->content = 'Example content';
Laravel使用魔法__set()
方法更新其$attributes
数组中的值。但是这个setter方法永远不会被调用,因为你有一个具有该名称的实际属性。
解决此问题需要做的是删除属性:
class Activity extends Eloquent {
protected $table = 'activity';
protected $timestamps = false;
protected $fillable = array('item', 'content', 'year');
}
如果您想记录属性并拥有自动完成支持,可以使用@property
注释:
/**
* @property string $item
* @property string $content
* @property int $year
*/
class Activity extends Eloquent {
答案 1 :(得分:0)
这是因为Eloquent使用魔术制定者/吸气剂。如果您执行了$model->randomAttribute
,那么它将查看数据的模型属性数组。
因为你已经明确定义了每个属性,所以它直接访问了属性,而不是魔术的getter。当您调用save()
时,该函数会将所有数据保存在不包含任何内容的属性数组中。
删除属性定义,它将起作用。
如果你致电$model->getAttributes()
,你会发现其中没有数据。
答案 2 :(得分:0)
卸下:
public $item;
public $content;
public $year;
从:
class Activity extends Eloquent {
protected $table = 'activity';
protected $timestamps = false;
public $item;
public $content;
public $year;
protected $fillable = array('item', 'content', 'year');
}