模型之间的锂蒙古关系

时间:2011-06-09 00:22:07

标签: mongodb mongodb-php lithium

我正在使用锂和mongodb,我想知道我的模型如何从Posts :: find('all')获取用户的数据;查询?

我是否必须进行两次查询?

感谢您的帮助!

    <?php
    namespace app\models;

    class Posts extends \lithium\data\Model {

        protected $_schema = array(
            '_id'           =>  array('type' => 'id'),
            'name'          =>  array('type' => 'string', 'null' => false),
            'description'   =>  array('type' => 'string', 'null' => false),
            'created'       =>  array('type' => 'datetime'),
            'updated'       =>  array('type' => 'datetime'),
            'user_id'       =>  array('type' => 'integer')
        );

        protected $_meta = array(
            'key' => '_id',
        );

        public $belongsTo = array('Users');


    }
    ?>


<?php
namespace app\models;

class Users extends \lithium\data\Model {

    public $hasMany = array('Posts');

    public $validates = array(
        'name' => 'Please enter a name',
    );

    protected $_schema = array(
        '_id'       =>  array('type' => 'id'),
        'name'      =>  array('type' => 'string', 'null' => false),
        'slug'      =>  array('type' => 'string', 'null' => false),
        'created'   =>  array('type' => 'datetime', 'null' => false),
    );

}
?>

3 个答案:

答案 0 :(得分:4)

目前,关系数据库仅存在于MySQL和SQLite3等关系数据库中。因此,您需要进行两次查询才能获得所需的数据。我们正在努力为基于文档的数据库添加对关系的支持,但目前还没有时间框架。

您可以在帖子的结果上使用Set :: extract来提取所有用户ID,然后使用其中的结果从用户进行单个查询 - 所以从你可以做的帖子$ userIDs = Set :: extract ('/ posts / user_id',$ posts-&gt; data());然后User :: find('all',array('conditions'=&gt; array('_ id'=&gt; $ userIDs)));

希望这会有所帮助。

编辑:你可以在这里找到set :: extract信息:http://li3.me/docs/lithium/util/Set::extract()

答案 1 :(得分:1)

  

我是否必须进行两次查询?

这取决于您的架构。

案例#1

如果UsersPosts是两个不同的集合,那么您将需要两个不同的查询。

案例#2

如果Users是顶级对象且Posts“属于”Users,那么您将执行等同于db.users.find({ posts : {$exists:true} })的操作。

我不是100%清楚Lithium如何处理这个问题。我找不到锂是做#1还是#2的简单例子。

答案 2 :(得分:1)

正如霍华德3所说,目前没有关系支持MongoDB,因此“属于”也不会有效。

实际决定取决于您的应用程序,但我认为它将成为某种形式的博客(用户和帖子)。根据MongoDB架构设计的最佳实践,我将它们放在单独的集合中,因为它们是“第一级集合”。更适合嵌入式文档的是帖子和评论。

此外,当您使用最新的主人时,您不必定义“关键”内容。您现在可以编写一个custom find method,当关系支持在核心中完成时,可以轻松地交换到更通用的解决方案。

如果您需要更多互动帮助,请访问freenode上的#li3。