CakePHP ve HABTM Model Sınır Hata

4 Cevap php

Ben Mesaj modelleri hasAndBelongsToMany Medya modelleri bir dizi var. Mesaj modelin içindeki bazı işlev çağrıları, ben Media modellerin tüm listesini almak gerekmez. Ancak, aşağıdaki kodu kullanabilirsiniz zaman:

$this->unbindModel( array('hasAndBelongsToMany' => array('Media')) );

// Rebind to get only the fields we need:
$this->bindModel(
        array('hasAndBelongsToMany' => array(
            'Media' => array(
                'className' => 'Media',
                'joinTable' => 'media_posts',
                'foreignKey' => 'post_id',
                'associationForeignKey' => 'media_id',
                'limit' => 1, 
                'fields' => array('Media.type', 'Media.path', 'Media.title')
            )
        )
    )
);
$this->find('all', $params);

Bu sınır, yalnızca ilk alınan Mesaj modellerinden biri üzerinde çalışır ve tüm aşağıdaki Mesaj modellerinde ilişkili Medya:

Array
(
    [0] => Array
        (
            [Profile] => Array
                (
                )

            [Media] => Array
                (
                    [0] => Array
                        (
                            [type] => photo
                            [path] => ''
                            [title] => ''
                        )

                )
        )

    [1] => Array
        (
            [Profile] => Array
                (
                )

            [Media] => Array
                (
                )

        )

)

Herhangi bir öneriniz çok iyi olurdu. Teşekkürler!

4 Cevap

neden containable behaviour kullanmayın

// you would probably want the next line in the app_model ot be able to use it with all models
$this->Post->actsAs = array('Containable')
$params['conditions'] = array(
);
$params['contain'] = array(
    'Media' => array(
        'fields' => array(
            'type', 'path', 'title'
        ),
        'limit' => 1
    )
);
$this->Post->find('all', $params);

EDIT:

Sadece bu çalıştı ve bu sql (Modül <-> Tag) var:

SELECT `Module`.`id` FROM `modules` AS `Module` WHERE 1 = 1 

ve

SELECT `Tag`.`id`, `ModulesTag`.`module_id`, `ModulesTag`.`tag_id` 
FROM `tags` AS `Tag` 
JOIN `modules_tags` AS `ModulesTag` 
  ON (`ModulesTag`.`module_id` IN (1, 2, 3, 4) AND `ModulesTag`.`tag_id` = `Tag`.`id`) 
WHERE `Tag`.`belongs_to` = 'Module' 
ORDER BY `Tag`.`name` ASC 
LIMIT 1

Her Modül sonuç için bir sorgu yapmak zorunda gibi tabii ki (bunlar daha sonra yine bir şekilde çok fazla sorgu neden olur), istenilen sonuca dönmek olamaz.

Sonuç olarak ben çok fazla sonuç satırlarda yük olarak (bizim örneğimizde) Tüm Etiketler dönecekti çok sorgularının yükü daha iyidir ..

Bu deneyin:

$this->yourModel->hasAndBelongsToMany['Media'] = false; // or null

Ve sonra elle HABTM dernek kurmak

$this->yourModel->hasAndBelongsToMany['Media'] = array(........);

Yoksa sadece battal olmadan dernek değiştirin:

$this->yourModel->HABTM['Media']['fields'] = array(....)

Kek bir toplu sorgudaki tüm habtm ilgili kayıtları getirir ve daha sonra daha sonra sonuçlar diziye onları birleştirir. Sorguda olduğu gibi dernek belirlediğiniz herhangi bir ek koşullar kullanılabilir olacak, bu yüzden böyle bir şey bakacağız:

SELECT … FROM Media WHERE Media.id in (1, 2, 3, …) LIMIT 1

Yani sadece tek bir HABTM modelini almak olacak.

Bunun için hiçbir görünüşte kolay bir çözüm yoktur. Belki de yine özgün öncül düşünebildiğim ve neden "ilk" (LIMIT 1) kayıt sözde doğru biridir, belki üzerinde sorgulamak için farklı bir durum bulabilirsiniz.

Medya medias_posts, pivot tabloya hasMany ilişki vardır böylece başarısız, sizin modelleri rebind olabilir. HasMany ve belongsTo sorgular için, Cake otomatik olarak JOIN sorguları yapar. Size istenilen sonucu verecek olan, daha sonra GROUP BY tümcesi kullanabilirsiniz:

SELECT … FROM Media JOIN medias_posts … GROUP BY medias_posts.post_id

Ayrıca geniş Yeniden birleştirme olmadan bu etkiyi elde etmek için, sorgu ile 'join' parametresini geçirerek deneme yapmak isteyebilirsiniz.

$this->Media->find('all', array('join' => array(…), …));

CakePHP bu containable behaviour için çok güçlü bir aracı var