我正在使用锂和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),
);
}
?>
答案 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
如果Users
和Posts
是两个不同的集合,那么您将需要两个不同的查询。
案例#2
如果Users
是顶级对象且Posts
“属于”Users
,那么您将执行等同于db.users.find({ posts : {$exists:true} })
的操作。
我不是100%清楚Lithium如何处理这个问题。我找不到锂是做#1还是#2的简单例子。
答案 2 :(得分:1)
正如霍华德3所说,目前没有关系支持MongoDB,因此“属于”也不会有效。
实际决定取决于您的应用程序,但我认为它将成为某种形式的博客(用户和帖子)。根据MongoDB架构设计的最佳实践,我将它们放在单独的集合中,因为它们是“第一级集合”。更适合嵌入式文档的是帖子和评论。
此外,当您使用最新的主人时,您不必定义“关键”内容。您现在可以编写一个custom find method,当关系支持在核心中完成时,可以轻松地交换到更通用的解决方案。
如果您需要更多互动帮助,请访问freenode上的#li3。