Nasıl I `$ this-> Model-> query ()` kullanmadan CakePKP'deki karmaşık bulmak sorgu yazabilirsiniz?

3 Cevap php

Hey tüm Birisi bu işi yapmak için Kek PHP ile yeterli tecrübeye sahip umuyorum.

Ben şu anda sevgiyle bir twitter klonu denebilecek bir şey üzerinde çalışıyorum. Esasen ben bir böyle kurdunuz.

Kullanıcılar, birçok arkadaşım var. Bu kullanıcı tabloya birçok ilişki bir çok fazladır. Bu sütunlu friends_users user_id adı masaya bir bağlantı friend_id saklanır. Kullanıcılar sütun user_id ile bir tablodur.

Sonra bir kullanıcıya ilişkilendiren ipuçları adında bir tablo var. Bir kullanıcı birçok ipucu olabilir.

Ben geçmek gibi o kullanıcının herhangi arkadaşlar ait herhangi bir ipucu kullanıcı'kimliği tarafından sahip olunan tüm ipuçlarını verir İpucu model üzerinde bir find yapmak için bir yol anlamaya istiyorum.

Bu SQL sorgusu mükemmel çalışır -

SELECT *
FROM `tips`
JOIN users ON users.id = tips.user_id
JOIN friends_users ON tips.user_id = friends_users.friend_id
WHERE (friends_users.user_id =2 or tips.user_id=2)
LIMIT 0 , 30

Bu kullanıcı # 2s ipuçları yanı sıra Kullanıcı 2 bir arkadaşı herkes ipuçları verir.

Şimdi nasıl kullanarak aynı şeyi yapabilirsiniz $this->Tip->findxxxxx(user_id)

Ben eğer gerekirse ben Tip->query kullanabilirsiniz biliyorum ama zor yoldan öğrenmek için çalışıyorum.

3 Cevap

Eğer sorgu sonuçlarında gereken tüm ipuçları listesi ise, ben 2 sorgularda bunu yapmak için cazip olacaktır. Bu kullanıcı ve onların arkadaşları, bu kimlikleri herhangi birine ait ipuçlarını bulmak için ikinci kullanıcı kimlikleri bir listesini bulmak için ilk. Yani, İpucu model:

function findTipsByUserAndFriends($userId) {
  //FriendsUser is automagically created by CakePHP "with" association
  $conditions = array('FriendsUser.user_id'=>$userId);
  $fields = 'FriendsUser.friend_id';
  //get a list friend ids for the given user
  $friendIds = $this->Tip->User->FriendsUser->find('list', compact('conditions', 'fields'));
  //get list of all userIds for whom you want the tips
  $userIds = array($userId) + $friendIds;
  $conditions = array('Tip.user_id'=>$userIds);
  $tips = $this->Tip->find('all', compact('conditions'));
  return $tips;
}

Bunu oluşturmak için gerekmez, böylece CakePHP sizin HABTM friends_users tablosunu modellemek için kullandığı automagically yarattı "FriendsUser" modeline ilk find aradığınız unutmayın.

Bunu bazı hata ayıklama gerekebilir, ama fikir olsun yani bu, denenmemiş olduğunu.

Ben bunu büyük eserler containable kullanmanızı tavsiye ederim.

$aCond = array(
            'fields' => array(
                'Discount.*'
            ),
            'contain' => array(
                'Event' => array(
                    'conditions' => array('Event.id' => $iEventId)
                )
            )
        );
$aBulkDiscounts = $this->Discount->find('first', $aCond);

Bu yardımcı olur umarım.

CakePHP konuşmak, birçok çok "Has Ve Birçok Ait" (HABTM) 'dir. Düzgün ilişkiler kurduğunuz varsayarsak, ne zaman yapmanız gereken size Geri alma onların bütün arkadaşları bulmak arkadaşı, ve bu arkadaşlar kendi ipuçları yüklü olsun böyle bir iki seviyeli özyinelemeli find, olması. Siz (uygulamada bir sorun çok fazla olmayabilir, olsa da) dinamik olarak onların arkadaşları getting bu arkadaşlar önlemek için / unbind modelleri bağlamak gerekebilir.

manual entry on associations okumak şarttır.