2011-06-09 2 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' => $ userID)));

надеюсь, что это поможет.

редактировать: Вы можете найти набор :: извлекать информацию здесь: http://li3.me/docs/lithium/util/Set::extract()

+0

Wahouh Мне нравится Set :: extract! –

1

Должен ли я сделать два запроса?

Это будет зависеть от вашей схемы.

Дело № 1

Если Users и Posts две разные коллекции, то вы будете нуждаться в двух различных запросов.

Дело № 2

Если Users это верхний объект уровня и Posts «принадлежит» Users тогда вы могли бы сделать что-то эквивалентное db.users.find({ posts : {$exists:true} }).

Я не на 100% понят, как литий обрабатывает это. Я не могу найти простой пример того, делает ли Lithium # 1 или # 2.

+0

Эй, Гейтс! Спасибо за Ваш ответ! Да, я тоже, я не могу найти какой-либо пример «принадлежит», я пытался, но я не знаю, как его использовать. Я на самом деле делаю дело №1. Я поддерживаю обновление, если найду решение. –

1

Как сказал Howard3, нет в настоящее время нет поддержки отношения для MongoDB и в результате «принадлежит» не будет работать.

Фактическое решение зависит от вашего приложения, но я предполагаю, что это будет какая-то форма блога (пользователи и сообщения). В соответствии с лучшими практиками дизайна схемы MongoDB я бы разместил оба в разных коллекциях, потому что они являются «коллекциями первого уровня». лучше подходит для встроенных документов, это будут сообщения и комментарии.

Кроме того, вы не должны определять «ключ», когда находитесь на последнем хозяине. Вы можете написать custom find method, который теперь может быть легко заменен на более общее решение, когда поддержка отношений завершена в ядре.

Если вам нужна дополнительная интерактивная справка, посетите # li3 на freenode.

Смежные вопросы