1

我最近开始使用 Yii PHP MVC 框架。我正在寻找有关如何通过框架继续使用数据库的建议:我应该使用框架的基类 CActiveRecord 来处理数据库,还是应该使用经典的 SQL 查询函数(在我的例子中是 mssql)?

显然与否,对我来说,通过经典的 SQL 查询处理数据库似乎更容易,但是,在某些时候,我认为使用框架的方式必须有一个优势。一些 SQL 查询经常会变得相当复杂。我只是无法理解该框架如何帮助我并且不会使事情变得比实际更复杂。

4

5 回答 5

2

根据我对 Yii 和海量数据库的经验,非常普遍的规则:

在以下情况下使用 Yii Active Record:

  1. 您想检索并发布数据库中的几行(例如,用户更改他/她的设置、更新用户余额、添加投票、获取在线用户数、获取主题下的帖子数、检查是否有模型存在)
  2. 您想在表格之间快速设计分层模型结构(例如,$user->info->email、$user->settings->currency),允许您在每次使用时快速调整显示的货币/设置。

在以下情况下远离 Yii Active Record:

  1. 您想一次更新 100 条记录。(模型开销太大)

    Yii::app()->db->command()  
    

    允许您避免重物并以简单数组的形式检索数据。

  2. 您想要执行涉及多个表的高级连接和查询。

  3. 任何批处理作业!!(例如检查付款表以查看哪些客户逾期付款,更新数据库值等)

我喜欢 Yii Active Record,但我会根据应用程序的要求在 Active Record 模型和普通 SQL 之间进行交换(使用 Yii::app()->db)。

最后,我可以选择是否要更新单个用户的货币

$user->info->currency = 'USD';
$user->info->save();

或者如果我想更新所有用户的货币:

Yii::app()->db->command('UPDATE ..... SET Currency="USD" where ...');
于 2013-02-24T21:52:09.337 回答
1

在任何语言中处理数据库时,框架都可以通过提供对数据库的抽象来帮助您。

这是我知道我在早期开发期间多次发现自己的场景:

  1. 我有一个需要数据库的应用程序。
  2. 我写了大量的代码。
  3. 我将 SQL 语句与其他所有内容一起放入代码中。
  4. 数据库以某种方式更改。
  5. 我不得不返回并对我的所有 SQL 语句进行 100 次更改。

这非常令人沮丧。

我发现的另一个场景:

  1. 我针对数据库编写了大量代码。
  2. 虫子进来了。很多虫子。我无法全部弄清楚。
  3. 我被要求为我的代码编写测试。
  4. 这是不可能的,因为我所有的代码都依赖于数据库的直接实现。当 SQL 语句与实际代码一起使用时,您如何测试它们?

所以我的建议是使用框架,因为它可以提供对数据库的抽象。这为您提供了两个非常大的优势:

  1. 您可以稍后换出数据库,并且您的代码保持不变!如果您使用接口/某些框架,那么很可能您正在处理对象而不是直接处理 SQL 语句。给定的实现可能知道如何写入 MySQL 或 SQL Server,但通常您的代码只是说“写入此对象”、“读取该列表”。

  2. 你可以测试你的代码!一个处理数据的好框架可以让您模拟数据库,以便您可以轻松地对其进行测试。

尽量避免直接在应用程序中编写 SQL 语句。以后会减轻你的痛苦。

于 2013-02-05T19:01:02.370 回答
0

我不熟悉与 Yii 捆绑的数据库系统,但建议您先使用它一点。我的经验是使用流行的 PHP ORM Propel。通常,ORM 系统的每个表都有一个类(Propel 每个表有三个)。

现在,可能会有一种语法来进行查找和连接等,但首先要做的是弄清楚如何在查询中使用原始 SQL(对于任何 CRUD 操作)。在您的模型类中放置执行这些查询的方法,这样至少您将受益于代码的集中化。

一旦你完成了这项工作,你可以在以后迁移到推荐的方法,而不会被你必须一次性学习的大量材料所淹没。学习 Yii(尤其是如何在控制器之间共享代码,以及编写可维护的视图模板)需要一段时间,因此不要将它与许多其他事情过度复杂化可能是明智的。

于 2013-02-05T20:23:16.897 回答
0

为什么要使用 Yii:

试想一下,您有很多模块,并且您必须为每个模块编写分页代码;用老式的方式写作,需要很多时间;

为什么不使用 Yii ClistView 小部件?哦,这个小部件有一个好处:数据提供者和自动检查即将打印的文章的存在;

当使用 Yii CListView 与来自 ... Sphinx 搜索引擎的结果时,小部件将检查文章是否确实存在,因为结果可能不正确

为不存在的注册编写检测代码需要多长时间?

当你有不同类型的项目时,你会添加方法吗?

不!Yii 为你做这件事。

您以 crud 风格编写代码需要多长时间?创建、读取、更新、删除?

你打算改编另一个项目的旧代码吗?

Yii 有一个名为 Gii 的奇迹模块,它可以生成模型、模块、表单、控制器、crud ......等等

一开始可能看起来很难,但是当你有经验时,这很容易

于 2013-02-05T20:33:13.120 回答
0

我建议你应该使用 CActiveRecord。它会带来很多好处 -

  1. 如上所述,您可以直接在 yii 中使用许多小部件。(用于分页、网格等)

  2. Yii ORM 生成的查询是高度优化的。

  3. 您不需要将从 SQL 中提取的结果放入您的 VO 对象中。

  4. 如果由于某种原因修改了表(添加/删除列,更改数据类型),您只需要使用 yii 提供的工具重新生成模型。请确保您尽量避免对 yii 生成的模型进行任何代码更改,这将节省您的合并工作。

  5. 如果您打算在未来将数据库从 MYSQL 更改为其他供应商,那么您只需更改配置即可。

  6. 您和您的团队也将节省您宝贵的开发时间。

于 2013-02-22T06:57:22.760 回答