4

我正在将锂与 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),
    );

}
?>
4

3 回答 3

4

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

您可以对帖子的结果使用 Set::extract 以提取所有用户 ID,然后使用结果从用户中进行单个查询 - 因此您可以从帖子中执行 $userIDs = Set::extract('/帖子/user_id', $posts->data()); 然后 User::find('all', array('conditions' => array('_id' => $userIDs)));

希望这可以帮助。

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

于 2011-06-10T04:19:40.877 回答
1

我必须做两个查询吗?

这将取决于您的架构。

情况1

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

案例#2

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

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

于 2011-06-09T18:45:49.127 回答
1

正如 Howard3 所说,目前没有对 MongoDB 的关系支持,因此“属于”也不起作用。

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

此外,当您使用最新的 master 时,您不必定义“关键”的东西。您现在可以编写一个自定义的 find 方法,当核心中的关系支持完成时,它可以很容易地换成更通用的解决方案。

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

于 2011-06-10T12:15:31.720 回答