Cakephp - присоединиться, только если идентификатор не является нулевым - PullRequest
1 голос
/ 28 ноября 2011

У меня есть таблица активности с 3 $, принадлежащими ссылочным ключам.Мне нужна информация о соединении из этих идентификаторов, т. Е. Чтобы показать текст комментария - я не хочу сохранять текст дважды ... (то же самое для поста и темы).

Таблица активности: id |post_id |comment_id |topic_idВ каждой строке только post_id ИЛИ comment_id ИЛИ topic_id установлено, два других поля идентификатора равны NULL.

То есть, если post_id = 55, comment_id = NULL, topic_id = NULL, я получаю это:

Array
(
[0] => Array
    (
        [Activity] => Array
            (
                [id] => 1
                [post_id] => 55
                [comment_id] => 
                [topic_id] => 
            )

        [Post] => Array
            (
                [id] => 55
                [name] => Post #1
                [description] => This is Post #1.
                ...
            )

        [Comment] => Array
            (
                [id] => 
                [post_id] => 
                [titel] => 
                [description] => 
                ...
                [created] => 
                [modified] => 
            )

        [Topic] => Array
            (
                [id] => 
                ...
                [created] => 
                [modified] => 
            )
    )

[1] => Array
    (
        ...

Можно ли присоединиться, только если идентификатор ссылки НЕ НЕДЕЙСТВИТЕЛЕН?Я не хочу убивать пустые массивы после поиска с помощью цикла php for-each.

Другой идеей была эта таблица базы данных: id |Activitytype_id |Рефид присоединяется с динамическим связыванием необходимой таблицы в зависимости от Activitytype_id.- Это не сработало ...

Это то, что я хочу - возможно ли это?

Array
(
[0] => Array
    (
        [Activity] => Array
            (
                [id] => 1
                [post_id] => 55
                [comment_id] => 
                [topic_id] => 
            )

        [Post] => Array
            (
                [id] => 55
                [name] => Post #1
                [description] => This is Post #1.
                ...
            )
    )

[1] => Array
    (
        [Activity] => Array
            (
                [id] => 2
                [post_id] => 
                [comment_id] => 2
                [topic_id] => 
            )

        [Comment] => Array
            (
                [id] => 2
                [post_id] => 4
                [titel] => Blabla
                [description] => This is the comment description
                ...
                [created] => 2011-01-01 01:30:00
                [modified] => 2011-01-01 01:30:00
            )
    )

[2] => Array
    (
        ...

Заранее спасибо!: -)

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Вам потребуется запросить базу данных, чтобы узнать, какие идентификаторы null, а затем запросить базу данных во второй раз, чтобы получить связанные данные.

$activity = $this->Activity->read(null, 1);
// some logic to find foreign key with non-null value
$activity[$model] = $this->{$model}->read(null, $id);

Я бы не стал тратить ваше время на написание двух запросов; пусть CakePHP получит все результаты в одном запросе. :)

$activity = $this->Activity->findById(1);

Просто добавьте это в свою модель, чтобы отфильтровать пустые значения из результатов:

public function afterFind($results, $primary = false) {
    return Hash::filter($results);
}
0 голосов
/ 28 ноября 2011

Вы всегда можете сделать соединение вручную. То, что вы хотите, это сделать ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО СОЕДИНЕНИЯ, сделанного пирогом. Вы также можете сделать afterFind (), чтобы удалить что-то вроде этого.

в вашей модели, где вы используете метод поиска

function afterFind($results){
    foreach($results as $k => $result){
       if (empty($result['Post']['id'])){
            unset($results[$k]['Post']);
       }
       if (empty($result['Comment']['id'])){
            unset($results[$k]['Comment']);
       }
       if (empty($result['Topic']['id'])){
            unset($results[$k]['Topic']);
       }
    }
}

Однако объединение является более прямым решением.

...