2011-06-09 10 views
4

私はmongodbでリチウムを使用しています。私はどのように私がPosts :: find( 'all')からユーザーのデータを取得できるかを私のモデルで知りたいと思います。クエリ?モデル間のリチウムmongodbの関係

2つのクエリを実行する必要はありますか?

ありがとうございました!

<?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などのリレーショナルデータベースにのみ存在します。そのため、必要なデータを取得するために2つのクエリを作成する必要があります。私たちは文書ベースのデータベースの関係のサポートを追加しようと努めていますが、現在のところそれには時間枠はありません。

投稿からの結果にSet :: extractを使用すると、すべてのユーザーIDを取得してからその結果を使用して、ユーザーから単一のクエリを作成できます。$ userIDs = Set :: extract( '/ posts/user_id'、$ posts-> data()); User :: find( 'all'、array( '条件' =>配列( '_ id' => $ userIDs)));

これが役に立ちます。

編集:あなたがここで設定::抽出した情報を見つけることができます:http://li3.me/docs/lithium/util/Set::extract()

+0

Wahouh私はセット::エキスが好きです! –

1

私は2つのクエリを実行する必要がありますか?

これはスキーマによって異なります。

ケース#1

UsersPostsは、二つの異なるコレクションであるなら、あなたは二つの異なるクエリが必要になります。

ケース#2

Usersの場合は、トップレベルのオブジェクトとPostsUsers、あなたはdb.users.find({ posts : {$exists:true} })と同等の何かをするだろう「に所属する」です。

リチウムがこれをどのように処理するかは100%明確ではありません。私は、リチウムが#1か#2をしているかどうかの簡単な例を見つけることはできません。

+0

Hey Gates!ご回答有難うございます!うん、あまりにも、私は "に属して"の例を見つけることができませんでした、私は試してみましたが、私は本当にそれを使用する方法を知っていません。私は実際にケース#1をやっています。私が解決策を見つけたら、私はあなたの更新を続けます。 –

1

Howard3が言ったように、そこには現在ありませんMongoDBのための関係をサポートし、その結果としてのいずれかで動作しません「に属します」。

実際の決定はアプリケーションによって異なりますが、私はそれがブログ(ユーザーと投稿)の何らかの形になると想定しています。 MongoDBスキーマ設計のベストプラクティスによると、「第1レベルのコレクション」であるため、両方を別々のコレクションに入れています。埋め込まれたドキュメントに適しているのは投稿とコメントです。

また、最新のマスターを使用しているときに「キー」を定義する必要はありません。コアの中でリレーションサポートが終了したときに、より汎用的なソリューションに簡単にスワップできるcustom find methodを書くことができます。

もっとインタラクティブなヘルプが必要な場合は、#li3 on freenodeをご覧ください。