Solar Model数据库操作之添加数据
1对1添加数据
这里我们新添加一篇文章作为示例来说明1对1的数据添加情形。
- 该示例涉及的Model有: Articles、Contents。
- Articles与Contents的关系是1:1。
- Articles的字段有:id, title, author, user_id, created_time。
- Contents的字段有:id, article_id, body。
- 在Articles模型中添加了
$this->_hasOne('contents')
的关系。
actionAdd()源码
解析
得到新记录:$this->item = $this->_model->articles->fetchNew()
, $this->item
是Admin_Model_Articles_Record
对象,也是Solar_Struct
的对象。 该对象里有关于模型Articles的字段属性,则有:id
, title
, user_id
, author
, created_time
这些属性。
但是因为在模型Articles中添加了有1Content的关系,所以$this->item
还有一个content
的属性,该属性是一个Admin_Modle_Contents_Record
的对象,即:$this->item->content = $this->_model->contens->fetchNew()
。 那么类似$this->item->content这个对象就有模型Contents中的字段属性,即:id
, body
, article_id
。
定位到这段代码:
先获取post过来的数据,其中'article'是表单名的前缀,表单名由model[字段名]
组成。 $this->item->content->body = $data['content']
因为怕$this->item->load($data)使$this->item->content
对象变成string类型,所以要手动的为$this->item->content->body
赋值! 再将$data['content']
注销掉再$this->item->load($data)
。
$this->item->save()
,这段是保存的代码,先将数据插入到articles表中,得到刚插入记录的id,再赋给$this->item->content->article_id
, 这样就将articles与contents表联系起来了。
最后顺提一句,保存后最好是跳转到edit修改页面,修改刚才添加的文章。
1对多添加数据
为了说明1对多的情形,我们新添一张表scores,表示成绩表,因为每个学期都有成绩,所以1个用户有多个成绩。
- scores表的字段有:
id
,user_id
,team
,score
(team
表学期,比如‘2010上'; 'score'表分数)。 - 为scores表建立模型Scores。
- 在模型Users中添加与模型Scores的关系:
$this->_hasMany('scores')
。
*scores*表SQL源码如下:
actionAddScores()源码
这里我们要讨论的是在添加用户的时候要添加该用户的成绩。
解析
因为这里主要是说怎么对1对多的数据同时添加,也就是同时添加了users
和scores
两张表,所以我们主要讨论以下这几行代码:
在1对1的关系中我们添加文章的内容是通过$artilce->content->body = $data['body']
来添加的,在1对多的关系中我们是通过$user->scores[]['team'] = $data['team']
来添加的,这好像是添加多维数组一样,上面只对一个用户添加了一条score记录,如果想添加两条怎么办呢?类似,可以采用以下代码:
参考Solar_API Solar_Sql_Model_Collection::appendNew()方法。
多对多数据添加
让我们回到经典的Solar示例Acme的actionAdd(), 刚开始学习Solar时你可能看它看的迷迷糊糊的,现在我们来弄懂它。
actionAdd()源码
解析
当中最难理解的是下面这一段:
因为Blogs和Tags的关系是多对多关系,所以要通过一个中间表来建立它们之间的关系,在Acme中是通过模型Taggings来建立的。 在模型Blogs中是通过$this->_hasManyThrough('Tags', 'Taggings')
来建立三个模型之间的关系。
上面代码中将用户提交的tags变成一个$tags数组,然后通过模型Tags得到所有的$tag_all, 再通过 Solar_Sql_Model_Collection::appendNew() 方法将$tags添加进去, 该方法返回一条Solar_Sql_Model_Record记录的对象。