Phalcon 的Phalcon\Mvc\Model 类(您的模型应该扩展)旨在提供一种与数据库交互的面向对象的方式。例如,如果您的表是Shopping_Cart,那么您应该将您的班级命名为ShoppingCart。如果您的表有一个“id”列,那么您将在您的类public $id; 中定义一个属性。
Phalcon 还为您提供initialize() 和beforeValidationOnCreate() 等方法。我承认这些方法在它们如何工作、何时运行以及为什么你一开始想要调用它时会让人非常困惑。
initialize() 是不言自明的,只要你的课程开始就会被调用。如果您的表与您的类的名称不同,您可以在这里执行setSource 之类的操作,或者调用belongsTo 和hasMany 之类的方法来定义其与其他表的关系。
关系很有用,因为它可以很容易地执行一些操作,例如在用户的购物车中搜索产品,然后使用 id,您将获得对 Accounts 表的引用,最后获取卖家的用户名买家购物车中的商品。
我的意思是,当然,你可以对这类东西进行单独的查询,但是如果你在一开始就定义了表关系,为什么不呢?
就为数据库中的每个表定义专用模型的意义而言,您可以定义自己的自定义方法来管理模型。例如,您可能希望在 ShoppingCart 类中定义 public function updateItemsInCart($productId,$quantity) 方法。然后的想法是,每当您需要与 ShoppingCart 交互时,您只需调用此方法并让 Model 担心业务逻辑。这不是编写一些复杂的update 查询,它也可以工作。
是的,您可以将这种东西放入您的控制器中。但也有一个 DRY(不要重复自己)原则。 MVC 的目的是关注点分离。那么,如果您不想要专门的模型部分,为什么要首先关注 MVC?好吧,也许你不需要一个。并非每个应用程序都需要模型。例如此代码不使用任何代码:https://github.com/phalcon/blog
就个人而言,在使用 Phalcon 的模型结构一段时间后,我开始不喜欢他们对模型的 1 层方法。在实体、服务和存储库的方向上,我更喜欢多层模型。你可以在这里找到这样的代码:
https://github.com/phalcon/mvc/tree/master/multiple-service-layer-model/apps/models
但是由于使用了太多的抽象,这可能会很快变得过大并且难以管理。介于两者之间的解决方案通常是可行的。
但老实说,使用 Phalcon 的内置数据库适配器进行查询并没有错。如果您遇到一个很难编写的查询,没有人说您的每个模型都需要扩展Phalcon\Mvc\Model。写这样的东西仍然是完全合理的逻辑:
$pdo = \Phalcon\DI::getDefault()->getDb()->prepare($sql);
foreach($params as $key => &$val)
{
$pdo->bindParam($key,$val);
}
$pdo->setFetchMode(PDO::FETCH_OBJ);
$pdo->execute();
$results=$pdo->fetchAll();
模型非常灵活,没有“最好”的排列方式。 “无论什么都行”的方法很好。以及“我希望我的模型对我可能想要的每个操作都有一个方法”。
我承认invo 和vokuro 半功能示例(仅为演示目的而构建)对于养成良好的模型设计习惯并不是很好。我建议找一个真正认真使用的软件,比如论坛的代码:https://github.com/phalcon/forum/tree/master/app/models
Phalcon 仍然是一个相当新的框架,可以在那里找到好的榜样。
正如您所提到的,关于将所有模型放在一个文件中,这非常好。请注意,如前所述,在initialize 中使用setSource,您可以以不同于他们正在处理的表的方式命名您的类。您还可以利用命名空间并使类与表名匹配。您可以更进一步,创建一个类来使用 setSource 动态创建所有表。假设您想使用 Phalcon 的数据库适配器。在 PDO 之上编写自己的代码或使用其他框架的数据库适配器并没有错。
正如您所说,关注点分离对您在小型团队中并不那么重要,因此您可以在没有模型目录的情况下摆脱困境。如果有任何帮助,您可以使用我为您的数据库适配器编写的内容:http://pastie.org/10631358
然后你会把它扔到你的 app/library 目录中。像这样在你的配置中加载组件:
$di->set('easySQL', function(){
return new EasySQL();
});
然后在您的 Basemodel 中放置:
public function easyQuery($sql,$params=array())
{
return $this->di->getEasySQL()->prepare($sql,$params)->execute()->fetchAll();
}
最后,从一个模型中,你可以做一些简单的事情:
$this->easyQuery($sqlString,array(':id'=>$id));
或者全局定义函数,这样你的控制器也可以使用它,等等。
还有其他方法可以做到这一点。希望我的“EasySQL”组件能让你更接近你的目标。根据您的需要,也许我的“EasySQL”组件只是写得很长:
$query = new \Phalcon\Mvc\Model\Query($sql, $di);
$matches=$query->execute($params);
如果没有,也许你正在寻找更多的东西
$matches=MyModel::query()->where(...)->orderBy(...)->limit(...)->execute();
这很好。