4

私はmongodbでリチウムを使用しています。以下のモデルで、Posts::find('all'); からユーザーのデータを取得する方法を知りたいです。クエリ?

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

3 に答える 3

4

現在、リレーションシップは、MySQL や SQLite3 などのリレーショナル データベースに対してのみ存在します。そのため、必要なデータを取得するには 2 つのクエリを作成する必要があります。現在、ドキュメント ベースのデータベースのリレーションシップのサポートを追加する作業を行っていますが、現時点では時間枠はありません。

投稿の結果に対して Set::extract を使用してすべてのユーザー ID を取得し、その結果を使用してユーザーから単一のクエリを作成できます。つまり、投稿から $userIDs = Set::extract('/ posts/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

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

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

ケース#1

Usersとが2つの異なるコレクションである場合、 Posts2つの異なるクエリが必要になります。

ケース#2

Usersが最上位オブジェクトであり、Posts「に属している」場合は、Usersと同等の処理を実行しdb.users.find({ posts : {$exists:true} })ます。

Lithiumがこれをどのように処理するかについては100%明確ではありません。Lithiumが#1と#2のどちらを実行しているかの簡単な例を見つけることができません。

于 2011-06-09T18:45:49.127 に答える
1

Howard3が言ったように、現在MongoDBのリレーションシップサポートはなく、その結果、「に属する」も機能しません。

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

また、最新のマスターを使用している場合は、「キー」を定義する必要はありません。今のところ、リレーションのサポートがコアで終了したときに、より一般的なソリューションに簡単に交換できるカスタム検索メソッドを作成できます。

よりインタラクティブなヘルプが必要な場合は、freenodeの#li3にアクセスしてください。

于 2011-06-10T12:15:31.720 に答える