CakePHP - Как я мог получить связанный объект? - PullRequest
2 голосов
/ 23 октября 2010

Я пытаюсь привести все commments в соответствие с моим текущим post, я делаю это следующим образом:

$this->Post->Comment->find('all', array('conditions' => array('post_id' => $id)));

, но, на мой взгляд, это немного неудобно.Почему я должен дать post_id?Разве не очевидно, что я хочу Comment, связанный с текущим Post?

Ответы [ 2 ]

1 голос
/ 24 октября 2010

$this->Post->Comment-> ... относится к структуре модели. $this обозначает этот экземпляр этого класса, а не текущую запись.

То есть $this - это PostsController, $this->Post - это модель Post, а $this->Post->Comment - это модель Comment. Ни одно из них не относится к конкретной записи.

$this->Post->id будет установлен, только если предыдущий запрос (в этом методе) получил однозначный результат, и я полагаюсь, что он устанавливается сразу после $this->MyModel->save($data), в противном случае я устанавливаю его явно, как:

$this->MyModel->id = $id;

Лично я бы сделал это следующим образом и извлек бы все необходимые связанные данные одним оператором:

$this->Post->contain(array('Comment')); // If you're using containable, which I recommend. Otherwise just omit this line.
$this->Post->read(null,$id);

Теперь у вас будет сообщение и связанные с ним комментарии в массиве, подобном следующему:

Array
(  
    [Post] => Array
        (
            [id] => 121
            [title] => Blah Blah an More Blah
            [text] => When the bar is four deep and the frontline is in witch's hats what can be done?
            [created] => 2010-10-23 10:31:01
        )
    [Comment] => Array
        (
            [0] => Array
                (
                    [id] => 123
                    [user_id] => 121
                    [title] => Alex
                    [body] => They only need visit the bar once in the entire night.
                    [created] => 010-10-23 10:31:01
                )
            [1] => Array
                (
                    [id] => 124
                    [user_id] => 121
                    [title] => Ben
                    [body] => Thanks, Alex, I hadn't thought of that.
                    [created] => 010-10-23 10:41:01
                )
        )
)

... и вы получите в комментариях, как это:

$comments = $this->data['Comment'];

Все, что вы хотите (что вы можете точно настроить при вызове contain()) относительно этого сообщения, возвращается в одном удобном пакете. Кстати, прочитайте о поведении Containable, если вы еще этого не сделали. Чем раньше вы начнете его использовать, тем легче станет жизнь.

0 голосов
/ 24 октября 2010

Если вы не укажете условия ($this->Post->Comment->find('all');), вы получите все комментарии с соответствующими записями.

Желательно указывать название модели в условиях: $this->Post->Comment->find('all', array('conditions' => array('Comment.post_id' => $id)));. Таким образом, вы получите комментарии к конкретному сообщению и все связанные (с комментариями) данные.

Если вам не нравится массив 'conditions', вам нужно явно указать id, как упоминал Лео (из контроллера Post):

$this->Post->id = $id;
$this->Post->read();

Таким образом, вы получите сообщение и все связанные с ним данные.

Обратите внимание, что в первом методе вы получаете все данные, связанные с комментариями, а во втором методе - все данные, связанные с сообщением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...