CakePHP Model: COUNT (*) Containable içinde

2 Cevap php

Ben bir CakePHP 1.3 uygulaması var ve gerçekten veri alma için Containable behavior tadını çıkarın.

Diyelim ki Yorumlarla bir-çok ilişkisi Mesajını sahip varsayalım. Ben (sayfalandırmada) Tüm Mesajlar listesini ve aidiyet Yorumlar sorgulamak için Containable kullanın. Ama ben her post kaç görmediniz sadece ilgileniyorum. Ben Yorumlar tüm satırlarını getiriliyor olmadan containable ile bu sorgu başarmak için herhangi bir yol bulamadık. Denedim:

$this->paginate=array(
            'fields' => 'Post.title, Post.created',
            'contain' => array('Comment'=>'COUNT(*) AS count'),
        );

sonuçları hata iletisi 'Modeli "Comment" modeli "Count" ile ilişkili değildir'.

$this->paginate=array(
            'fields' => array('Post.title, Post.created'),
            'contain' => array('Comment'=>array('fields'=>'COUNT(*) AS count'),
        );

Sonuç kümesi, her konu için sayım alanını içeren, ama tüm yorumların sayısını sadece ait olanları olan sonuncusu hariç, boş Yorum dizisini içerir, çalışmıyor.

Benim diğer tahminim oldu

$this->paginate=array(
            'fields' => 'Post.title, Post.created, COUNT(Comment.id)',
            'contain' => array('Comment'=>array('fields'=>''),
        );

but this results in an error, because hasMany relationships are queried independently, so the Answer table is not in the query for the Post entries. How can I count the number of Comments a Post has?

2 Cevap

Peki, bunu yapmanın en iyi yolu, comment_count posts tablo ve Açıklama modeli $ belongsTo Mesaj dizisi için bu anahtarı eklemek adında bir alan kurmak için:

'counterCache' => true

Her zaman bir şey yorumlarla neler olacak, ilgili sonrası COMMENT_COUNT alan (aslında, bunun yerine sadece ekleme veya silme, her zaman anlatır) güncellenecektir.

Bu kullanıcı verilerini getir zaman nedeniyle yolu daha hızlı, daha iyi ve hatta yorumlar tablosunu dokunmaz. Eğer Containable davranışı kullanarak konum beri ben hız ve hafif aradığınız budur sanırım.

Ben aynı soru vardı. PawelMysior verdi cevabı büyük ve çözüme yol.

Ben CakePHP Kitap biraz daha ayrıntı bulundu: 3.7.4.1.1 counterCache - Cache your count(). Bu yararlı ama yine de biraz belirsiz oldu. Başkalarının iyiliği için, ben biraz daha ayrıntı istiyoruz.

Mesaj ve Resim: İki tablo var. Ben Görüntü masaya ekstra sayısı sorgusu çalıştırmak için gerek kalmadan, her yazılan Mesaj kütüğü listesinde görüntülenmesi için ne kadar çok görsel takip etmek istediğiniz bir mesaja resim zaman eklendi.

CREATE TABLE posts
(
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INTEGER UNSIGNED NOT NULL,
title VARCHAR(255),
body TEXT,
created DATETIME,
modified DATETIME,
image_count INTEGER UNSIGNED,
PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE images
(
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
post_id INTEGER UNSIGNED NOT NULL,
filename VARCHAR(255),
created DATETIME,
modified DATETIME,
PRIMARY KEY (id)
) ENGINE=InnoDB;

image_count posts tabloda gider edin. Özel bir şey images tabloda gereklidir.

class Post extends AppModel
{
    var $name = 'Memory';
    var $hasMany = array(
        'Image' => array(
            'className' => 'Image',
            'foreignKey' => 'post_id',
            'dependent' => false
        )
    );
}

class Image extends AppModel
{
    var $name = 'Image';
    var $belongsTo = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'post_id',
            'counterCache' => true
        )
    );
}

counterCache Image modeli eklenir dikkat edin. Özel bir şey Post modeli gereklidir.

$this->Post->Behaviors->attach('Containable');
$post = $this->Post->find('all', array(
    'conditions' => array('user_id' => 7),
    'order' => array('Post.created DESC'),
    'contain' => array(
        'Post' => array(
            'User' => array('first_name', 'last_name')
        )
    )
));

Şimdi biz ne zaman bir otomatik Post sonuçlarında bir alan olduğu için find sayısını bulmak için özel bir şey yapmaya gerek yoktur. image_count, aşağıda dikkat edin.

Array
(
[Post] => Array
        (
            [0] => Array
                (
                    [id] => 14
                    [user_id] => 7
                    [title] => Another great post
                    [body] => Lorem ipsum...
                    [created] => 2011-10-26 11:45:05
                    [modified] => 2011-10-26 11:45:05
                    [image_count] => 21
                    [User] => Array
                    (
                        [first_name] => John
                        [last_name] => Doe
                    )
                )
        )
)

Başka Image eklenene kadar varolan bir veritabanı yapısına counterCache eklerseniz bir şey, not, içinde sayıları Post sıfır olacaktır. Noktada, CakePHP gerçek bir sayımı yapacak ve doğru miktarda image_count güncelleyin.

Ben bu ekstra bilgiler birileri için yararlı olduğunu umuyoruz.