Как правильно написать Model-> find () в CakePhp для трех таблиц? - PullRequest
1 голос
/ 25 мая 2009

Может кто-нибудь сказать мне, как лучше всего сделать что-то вроде, из БД как

Table 1
-id
-data
-foreign_key_id_table2

Table 2
-id
-data
-foreign_key_id_table3

Table 3
-id
-data

Мне нужно выбрать все элементы таблицы один, связанные со всеми элементами таблицы 2 данной записи таблицы 3 что-то вроде

select table1.data from table1 where table1.foreign_key_id_table2 in (select table2.id from table2 where table2.foreign_key_id_table3 = X)

но мне нужно сделать это с cakephp, и, поскольку я новичок в этом, я не могу понять, как

пожалуйста, помогите:)

Ответы [ 2 ]

4 голосов
/ 25 мая 2009

Хорошо, я попытаюсь помочь с "научить человека ловить рыбу".

Модели тортов представляют собой таблицы базы данных. У каждой модели может быть определено ассоциаций , таких как assignTo, hasMany, hasOne и т. Д. Когда вы определяете ассоциацию, торт распознает ее и получает все необходимые данные.

Например, допустим, у вас есть модельный пост и модельный комментарий. Если вы установите связь между ними (Post-hasMany-Comment и Comment-ownTo-Post), торт будет работать по волшебству каждый раз, когда вы делаете Post-> find () или Comment-> find ()

Так что это значит? Если вы делаете что-то вроде этого:

$ data = $ this-> Post-> findByTitle ('заголовок вашего сообщения');

переменная $ data будет содержать не только ваши данные Post, но и все связанные комментарии. Вы всегда можете увидеть, что там, позвонив по номеру debug($data);

Уровень «глубинного» торта с соответствующими данными может быть установлен с помощью свойства / параметра recursive или с помощью встроенного поведения Containable .

Еще одно преимущество определения связей между моделями (чтобы ответить на ваш комментарий к ответу Роба) состоит в том, что вам не нужно помещать все свои модели в переменную $ using var. На самом деле, это было бы неправильно .

Верьте или нет, но как только вы правильно определите свои ассоциации, это сработает:

class PostsController extends AppController
{
    // not really needed, cake detects it automagically
    var $uses = array('Post');

    function index()
    {
        $comments = $this->Post->Comment->find('all');
    }
}

Сладко, не правда ли?

В вашем случае это будет примерно так:

$this->Table1->find
    (
        'all',
        array
        (
            'conditions' => array
            (
                'Table2.foreign_key_id_table3' => X
            )
        )
    );

Есть много других полезных советов, когда вы работаете со встроенными функциями и классами тортов, поэтому я советую вам потратить некоторое время на то, чтобы правильно выучить торт, это облегчит вашу жизнь.

3 голосов
/ 25 мая 2009

Я бы порекомендовал использовать метод Cake find() для моделей. Все, что вам нужно сделать, это создать соответствующие ассоциации моделей, и Cake сделает всю работу за вас. В вашем случае это выглядит как модель Table1 belongsTo Table2 и Table2 belongsTo Table3.

В этом случае Table2 будет иметь отношение hasOne или hasMany к Table1, а Table 3 будет иметь такое же отношение к Table2.

Чтобы представить сценарий реального мира, рассмотрите вездесущее приложение для блогов. User может создавать Posts, а Post может иметь множество Comments:

База данных

users
 - id
 - data

posts
 - id
 - user_id
 - data

comments
 - id
 - post_id
 - data

User Модель

class User extends AppModel {
   $hasMany = array ( 'Post' );

   // ...
}

Post Модель

class Post extends AppModel {
   $hasMany = array ( 'Comment' );
   $belongsTo = array ( 'User' );

   // ...
}

Comment Модель

class Comment extends AppModel {
   $belongsTo = array ( 'Post' );

   // ...
}

Как только вы установили ассоциации, просто вызовите метод find() для любого объекта, который вас интересует, и Cake вернет связанные записи других классов.

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