2011-06-09 177 views
4

我使用鋰與mongodb,我想知道我的模型如何可以從Posts :: find('all')獲取用戶的數據。查詢?鋰的mongodb模型之間的關係

我必須做兩個查詢嗎?

感謝您的幫助!

<?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

當前關係只存在於像MySQL和SQLite3這樣的關係型數據庫中。因此,您需要進行兩個查詢才能獲取所需的數據。我們正在努力增加對基於文檔的數據庫關係的支持,但目前沒有時間表。

您可以使用Set :: extract對帖子中的結果進行抽取,以便將所有用戶標識的出來,然後使用該結果從用戶進行單個查詢 - 因此,您可以執行的操作$ userIDs = Set :: extract('/ posts/user_id',$ posts-> data());那麼User :: find('all',array('conditions'=> array('_ id'=> $ userIDs)));

希望這有助於。

編輯:您可以在這裏找到設置::提取信息:http://li3.me/docs/lithium/util/Set::extract()

+0

Wahouh我喜歡Set :: extract! – 2011-06-10 22:26:23

1

我必須做兩個查詢?

這將取決於您的模式。

案例#1

如果UsersPosts是兩個不同的集合,那麼你將需要兩個不同的查詢。

案例#2

如果Users是頂級對象,並Posts「屬於」 Users,那麼你會做一些等同於db.users.find({ posts : {$exists:true} })

我不是100%清楚鋰的處理方式。我無法找到一個簡單的例子,說明鋰是否正在做#1或#2。

+0

嘿蓋茨!感謝您的回答!我也是,我找不到任何「屬於」的例子,我試過但我不知道如何使用它。我實際上在做案例#1。如果我找到解決方案,我會保持更新。 – 2011-06-10 04:12:01

1

正如Howard3說,目前MongoDB的沒有關係的支持,因此「屬於」將不能工作。

實際的決定取決於您的應用程序,但我認爲它將成爲某種形式的博客(用戶和帖子)。根據MongoDB模式設計的最佳實踐,我將它們放在不同的集合中,因爲它們是「一級集合」。更適合嵌入式文檔將是帖子和評論。

另外,當你在最新的主人身上時,你不必定義'關鍵'的東西。您現在可以編寫一個custom find method,當關系支持在內核中完成時,可以輕鬆地將其更換爲更通用的解決方案。

如果您需要更多交互式幫助,請訪問freenode上的#li3。