什么$ model-> save()在PHP Yii中做什么?

时间:2014-06-19 11:33:39

标签: php yii

我有一些关于在PHP的Yii框架中保存模型的快速概念性问题。我已经遇到过这个代码几次$ model-> save()(例如if($ model-> save())....
但我从来都不明白这意味着什么。

另外,我在MVC提示/手册中读到我们应该尝试将模型保存在模型而不是控制器中 - 有人可以解释为什么会这样吗?我有一个朋友告诉我这没关系 - 但是,我想了解背后的规则。

谢谢你的帮助!

4 个答案:

答案 0 :(得分:6)

$model->save()做了什么?

只需check the source,它就在github上。应用逻辑,答案是可以预测的。

正如文档明确指出的那样:BaseActiveRecord代表一个数据对象。它可以是从MySQL查询返回的行,也可以是由客户端或MongoDB文档或其他任何内容发送的已处理表单。
在该对象上调用save或者将数据插入到您选择的数据库中,或者尝试更新该记录。根据插入/更新调用是否成功,它返回一个布尔值(如果保存成功则为true,如果失败则为false。)

非常直观,真的。如果您想了解有关您正在使用的工具/框架的更多信息,常识要求您查看他们的在线文档。在我看来,Yii的文档非常全面且易于导航:check them here

为什么要在模型中保存模型?

这很容易,但需要消除歧义。术语" model" 通常用于指代数据容器。在这种情况下,您调用save的对象。它们是数据模型,足够真实,它们用于在整个应用程序中来回传输数据。在Yii中,一些呼叫模型被称为" ActiveRecords"

在首字母缩写词MVC(如你所知的模型视图控制器)中, Model 部分实际上涵盖的不仅仅是数据容器。 " Model" (大写字母M)指的是Model层,也称为逻辑层或业务层。它是您的应用程序中实际包含大量代码的部分。在那里处理更复杂的计算,它是您连接和查询数据库的层。并且该层具有控制器将调用的方法。然后,这些方法将返回包含数据的数据模型(小写m)或控制器将传递给视图的计算结果。
如果你想知道什么逻辑/工作/类构成模型层,只需问自己这个简单的问题:" 这一点做什么?& #34; 如果它没有处理原始请求,并且它没有向用户呈现数据(分别是控制器和视图的作业),它就是'模型层的一部分,当然,除了路由器组件,调度程序以及将MVC框架连接在一起的所有内容之外。

控制器动作(显然,控制器中的方法)应该非常小。他们真正做的就是9/10次,将请求数据(表单提交等)倒入模型中,并在服务上调用一个或多个方法(这是Model层的一部分)。这些方法将接收在控制器中创建的模型作为参数,并设置为与它们一起使用 控制器可以执行一些基本的验证,但是模型层将点亮我们并穿过t。

一旦Model层完成了它的工作,它就会回到控制器,只剩下两件事要做:Model层是否返回了它预期的数据?如果是这样,将其传递给视图。如果不是(抛出异常或没有返回任何内容) - >处理错误/异常,如果需要,重定向用户。

简而言之:模型层是代码的主体,它通过数据模型与控制器(以及内部)进行通信。模型层永远不会直接与视图通信,也不会重定向用户或处理像$_POST数据这样的原始输入。


这里有几个链接到我的帖子,我进一步解释这一点,完成图表,什么不是。它们是代码审查的答案,因此请忽略处理代码本身的位,但背景信息可能与您相关:

CodeReview: How to put XML results in the MVC pattern?
CodeReview: PHP MVC: how to do $_POST the right way

答案 1 :(得分:1)

据我所知,$model变量是BaseActiveRecord类的实例。 所以当你打电话时:

$model->save();

Yii运行机制以在数据存储中插入/更新数据。

save()方法返回truefalse,这意味着是否保存了模型。 所以当你写:

if ($model->save()) {
    //some code will be here
}

您是否检查了已保存的型号。

这个tutorial描述了Yii如何实现MVC实践。

答案 2 :(得分:0)

它会在模型​​表示的表中插入一个新行。

即。如果我有一个名为$ user的模型代表一个名为users的表,那么调用$user->save();会在users表中插入一个新行。

if($model->save())

与:

相同
//Attempt to insert row
$inserted = $model->save();

//If insert is successful.
if($inserted){
    //Do this
}

请注意,许多框架还允许您通过save函数更新表行。在这些情况下,附加where条件或传入行的主键。

答案 3 :(得分:-1)

$ model-> save()用于在数据库中插入和更新数据。