【问题标题】:Yii: combination of CDbCommand and ActiveRecord queries in one Controller/ActionYii:将 CDbCommand 和 ActiveRecord 查询组合在一个 Controller/Action 中
【发布时间】:2012-08-19 20:18:49
【问题描述】:

我想知道将这些与检索/更新数据库数据的方式结合起来是否是一种好的(可接受的)做法?

例如,在我的数据库中,我有两个表(BooksUsers)和一个“多对多”表Books_Users。当用户评价一本书时,Books_Users 表应该被更新(一个新的记录应该是 book_iduser_id 应该被插入或删除)。

我在谷歌上搜索了仅使用 AR 方法的方法,但我没有找到任何好的解决方案。我最终在BookController 操作中使用了CDbCommand execute() 和非常简单的SQL 查询,例如INSERT INTO books_users(book_id, user_id) VALUES(:bid , :uid);

关键是我所有的模型都扩展了CActiveRecord,而且我一直使用AR方法。

所以问题来了:这种不同方法的混合可以毫无悔意地使用,还是我应该立即摆脱它并以某种“正确的方式”编写代码?

【问题讨论】:

    标签: sql activerecord coding-style yii many-to-many


    【解决方案1】:

    Yii 确实支持Many_TO_Many 关系(在某种程度上),并且这种支持通过 1.1.x 版本 http://www.yiiframework.com/doc/guide/database.arr 得到了改进。

    一般来说,我认为您不必使用CDbCommand 并使用 SQL,您不应该遇到任何问题,使用 AR 特别是 检索 部分,但是,插入(创建/更新)可能是一个问题(虽然不是一个大问题),因为它可以通过数据库级​​别(数据库触发器)或应用程序级别(模型)的一些触发器来解决afterCreate() & afterUpdate()) 自动填充/更新中间表(数据透视)记录。

    另一种(更简洁的)方法是使用此扩展程序:http://www.yiiframework.com/extension/cadvancedarbehavior/,它应该可以为您完成这项工作。

    最后一件事:查看this question 和this one 以获得相关查询。

    【讨论】:

    • 感谢您的回答。我之前看到了扩展和链接,但没有结果。是的,我在检索方面没有问题,但我实际上不需要更新 模型。我只需要在关系表中插入或删除一行。老实说,我刚刚尝试了扩展,它不起作用。 $book->save() 总是失败并返回 false。我不得不返回 CDbCommand。很遗憾我没有太多时间深入挖掘(因为我是 Yii 新手,所以需要大量时间),但我希望以后能解决这个问题......
    • 好吧,我仍然认为投资于解决你的扩展问题(如果你选择,你应该在 Q 中添加相关细节)比投资于用CDbCommand 修补猴子要好但它是你的选择!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多