1

さて、私のcakephpプロジェクトには6つのモデルがあり、それらは{User,Property,Category,Status,Comments,Attachable}です

プロパティ モデル: $belongsTo = {User,Category,Status} . AND $hasMany = {コメント、添付可能} ..

プロパティ コントローラ インデックス メソッド ..

public function index() {
    $this->Property->recursive = 0;
    $this->set('properties', $this->paginate());
    $properties= $this->paginate();
    //pr($properties);
    //exit;
}

出力:

Array
(
    [0] => Array
        (
            [Property] => Array
                (
                    [id] => 1
                    [user_id] => 1
                    [category_id] => 1
                )

            [User] => Array
                (
                    [id] => 1
                    [name] => zals
                    [username] => admin
                    [userLevel] => 1
                )

            [Category] => Array
                (
                    [id] => 1
                    [name] => villa
                    [property_count] => 0
                )

            [Status] => Array
                (
                    [id] => 1
                    [name] => New
                    [property_count] => 0
                )
        )

    [1] => Array
        (
            [Property] => Array
                (
                    [id] => 2
                    [user_id] => 1
                    [phone] => 78666
                )

            [User] => Array
                (
                    [id] => 1
                    [name] => zals
                    [username] => admin
                )

            [Category] => Array
                (
                    [id] => 1
                    [name] => villa
                    [description] => villas are iby a wealthy person.
                    [property_count] => 0
                )

            [Status] => Array
                (
                    [id] => 1
                    [name] => New
                    [description] => New Property
                    [property_count] => 0
                )

        )

    [2] => Array
        (
            [Property] => Array
                (
                    [id] => 3
                    [user_id] => 1
                    [category_id] => 1
                )

            [User] => Array
                (
                    [id] => 1
                    [name] => zals
                    [username] => admin
                    [email] => admin@realty.com
                    [userLevel] => 1
                )

            [Category] => Array
                (
                    [id] => 1
                    [name] => villa
                    [property_count] => 0
                )

            [Status] => Array
                (
                    [id] => 1
                    [name] => New
                    [property_count] => 0
                )

        )
)

上記のメソッドは、$belongsTo 変数のモデルからのみデータを取得します。私が望むのは、関連するコメントとアタッチ可能なモデルを同じクエリと組み合わせることです。これは、LEFT JOIN を使用して、コメントおよび添付可能な MODEL に手動で照会できます。

これはクエリがどのように見えるかです

function index() {
    $properties = $this->Property->query("SELECT `Property`.`id`, `Property`.`user_id`, `Property`.`category_id`, `Property`.`status_id`, `Property`.`state_id`, `User`.`id`, `User`.`name`, `User`.`username`,`Category`.`id`, `Category`.`name`, `Category`.`description`, `Status`.`name`, `Status`.`description``Comment`.`id`,`Comment`.`name`,`Comment`.`comment`,`Attachment`.`id`,`Attachment`.`AttachmentName` FROM `properties` AS `Property`
        LEFT JOIN `users` AS `User` ON (`Property`.`user_id` = `User`.`id`)
        LEFT JOIN `categories` AS `Category` ON (`Property`.`category_id` = `Category`.`id`)
        LEFT JOIN `statuses` AS `Status` ON (`Property`.`status_id` = `Status`.`id`)
        LEFT JOIN `cities` AS `City` ON (`Property`.`city_id` = `City`.`id`)
        LEFT JOIN `comments` AS `Comment` ON (`Property`.`id` = `Comment`.`id`)
        LEFT JOIN `attachments` AS `Attachment` ON (`Property`.`id` = `Attachment`.`id`) WHERE 1 = 1 LIMIT 20");
    //pr($properties);
    //exit;
    $this->set('properties',$properties);   
}

出力:

Array
(
    [0] => Array
        (
            [Property] => Array
                (
                    [id] => 1
                    [user_id] => 1
                    [category_id] => 1
                    [status_id] => 1
                )
            [User] => Array
                (
                    [id] => 1
                    [name] => za
                    [username] => admin
                )
            [Category] => Array
                (
                    [id] => 1
                    [name] => villa
                    [description] => villa by a wealthy person.
                )
            [Status] => Array
                (
                    [name] => New
                )
            [Comment] => Array
                (
                    [id] => 1
                    [name] => A
                    [comment] => hello
                )
            [Attachment] => Array
                (
                    [id] => 1
                    [AttachmentName] => 1342009083_4c2380.jpg
                )
        )
    [1] => Array
        (
            [Property] => Array
                (
                    [id] => 2
                    [user_id] => 1
                    [category_id] => 1
                    [status_id] => 1
                )
            [User] => Array
                (
                    [id] => 1
                    [name] => zals
                    [username] => admin
                )
            [Category] => Array
                (
                    [id] => 1
                    [name] => villa
                    [description] => villas a
                )
            [Status] => Array
                (
                    [name] => New
                )
            [Comment] => Array
                (
                    [id] => 2
                    [name] => asdasd
                    [comment] => asdasdas
                )
            [Attachment] => Array
                (
                    [id] => 2
                    [AttachmentName] => 92f2e3c067d731a3823762.jpg
                )
        )
)

後者の方法は正しい方法ではないと確信しています。または
、コントローラで Cakephp のデフォルトのインデックス メソッドを使用したとします。VIEW では、メインの foreach ループ内でネストされた foreach ループを実行できます。

<?php foreach ($properties as $property) { ?>
    $id = $property['Property']['id'];
    $comments = ..... //here to query for the associated comments passing the id value .. 
?>  

これはこのように整理できますか?またはどのように?ガイドしてください..ありがとう..

4

1 に答える 1

1

2つのこと:

  1. Containable 動作を使用することで、問題を解決できる可能性があります。非常に柔軟で、ページネーションで使用できます。
  2. inner join一対多のリレーションを行うことは、おそらく良い考えではありません。
于 2012-07-15T11:29:07.687 に答える