Nasıl "OR" uzun bir liste yapmadan bir model için tüm kayıtları bulabilirsiniz

5 Cevap php

Ben sorun ben arıyorum kayıtları döndüren bir CakePHP find () beste yaşıyorum.

Benim dernekler böyle gidin:

User ->(has many)-> Friends ,
User ->(has many)-> Posts

Ben her bir kullanıcının arkadaşlarını son mesaj bir listesini görüntülemek için çalışıyorum, başka bir deyişle, oturum açmış geçerli kullanıcının bir arkadaşı tarafından oluşturulan her yazı listelemek

Bu yaptığını düşünebilirsiniz tek yolu find () çağrısı gibi bir şey olmazdı, böylece büyük bir dizideki tüm kullanıcının arkadaşlarının user_ids koyarak ve ardından her biri döngü tarafından:

$posts = $this->Post->find('all',array(
            'conditions' => array(
                'Post.user_id' => array(
                    'OR' => array(
                        $user_id_array[0],$user_id_array[1],$user_id_array[2] # .. etc
                    )
                )           
            )
        ));

Ben o kullanıcının bir sürü OR koşulları bulunuyor popüler sanki bu şeyler yapmanın en iyi yolu değildir izlenim olsun. Herkes daha iyi bir alternatif önerebilirsiniz?

Netleştirmek için, burada veritabanının basitleştirilmiş bir versiyonu:

"Users" table
id
username
etc

"Friends" table
id
user_id
friend_id
etc

"Posts" table
id
user_id
etc

5 Cevap

Eğer yeniden yazılamaz ne inceledikten sonra, ben ne yaptığınızı anlıyorum. Geçerli yapı çalışmaz. Arkadaşlarına mesaj referans yoktur. Yani attılar şemasına göre, arkadaşları herhangi bir mesaj eklemek OLAMAZ. Ben ne yapmaya çalıştığınız referans diğer kullanıcılardan biri olarak bir arkadaşım olduğunu düşünüyorum. Anlamı, bir kullanıcılar ARKADAŞ aslında KULLANICILARI tabloda sadece başka KULLANICI olduğunu. Bu kendi kendine referans HABTM ilişkidir. Yani burada ben önereceğim budur:

1 - Öncelikle, emin DB oluşturulan HABTM tablo var olun:

-- MySQL CREATE TABLE users_users ( user_id char(36) NOT NULL,
friend_id char(36) NOT NULL );

2 - Kullanıcı modelinde ilişkiler kurun.

var $hasAndBelongsToMany = array(
'friend' => array('className' => 'User',
  'joinTable' => 'users_users',
  'foreignKey' => 'user_id',
  'associationForeignKey' => 'friend_id',
  'unique' => true,
  ),
);

var $hasMany = array(
'Post' => array(
  'className' => 'Post',
  'foreignKey' => 'user_id'
),
);

3- use the scaffolding to insert a few records, linking friends and adding posts. 4- Add the view record function to the Users controller:

function get_user($id)
{
  $posts = $this->User->find('first', array(
      'conditions' => array('User.id' => $id),
      'recursive' => '2'
  ));
  pr($posts);
}

5 - Şimdi aşağıdaki komutu kullanarak kayıtları çekmek için özyinelemeli kullanarak kullanıcı tablo sorgulayabilirsiniz:

http://test/users/get_user/USER_ID

6 - Eğer ($ Mesajları) pr zaman Sizin çıkış döndürülen veri ağacında arkadaşları ve görevlerine dahil (yinelemeli) tüm kayıtları gösterecektir

Ben bu uzun bir post biliyorum, ama ben bunu yapmak için çalışıyoruz ne için en iyi çözüm sağlayacaktır düşünüyorum. CakePHP gücü inanılmaz. Bu bizi öldürür öğrenme eğrisi.

Mutlu Kodlama!

Post.user_id Friend.id o zaman olurdu (convention btw hangi takip etmem) işaret ediyorsa

$posts = $this->Post->find('all',array(
    'conditions' => array(
        'Post.user_id' => $user_id_array      
    )
);

olmasına neden olur ki .. WHERE Post.user_id IN (1, 2, 3) ..

Ayarlarınıza bağlı olarak, oldukça Kek şeyler aracılığıyla bir araya zincirine onlara çalışırken daha iki sorguları çalıştırmak için daha hızlı olabilir. Ben Kullanıcılar modelinde getFriendsPosts gibi bir şey () ekleyerek tavsiye ederim.

<?php
 class UserModel extends AppModel {
 // ... stuff
  function getFriendsPosts( $user_id )
  {
   $friends = $this->find( ... parameters to get user IDs of all friends );
   // flatten the array or tweak your params so they fit the conditions parameter.  Check out the Set class in CakePHP
   $posts = $this->find( 'all', array( 'conditions' => array( 'User.id' => $friends ) ) );
   return $posts;
  }
 }
?>

Sonra sadece do denetleyicisi, onu aramak için

$friends = $this->User->getFriendsPosts( $this->Auth->User('id') );

HTH, Travis

CakePHP zaten verimli kod üreten değil mi:

SELECT * from Posts WHERE user_id IN (id1, id2 ...)

değilse, yapabileceğiniz

$conditions='NULL';
foreach($user_id_array as $id) $conditions.=", $id";

$posts = $this->Posts->find('all', array(
    'conditions' => "Post.user_id IN ($conditions)",
));

Lütfen modelleri düzgün ilişkili ise, Cake otomatik olarak ilgili kayıtları modeli alır. Belirli bir kullanıcı için arama yaparken Yani, Cake otomatik olarak ilgili arkadaşlar almak, ve bu arkadaşların ilgili mesajlar olacaktır. Yapmanız gereken tüm yeterince yüksek özyineleme düzeyi ayarlanır.

$user = $this->User->find('first', array('conditions' => array('User.id' => $id), 'recursive' => 2));
debug($user);

// gives something like:
array(
    User => array()
    Friend => array(
        0 => array(
            ...
            Post => array()
        ),
        1 => array(
            ...
            Post => array()
        )
    )
)

Yapmanız gereken tüm kadar kolaydır kullanıcının arkadaşları, gelen mesajları ayıklamak olduğunu:

$postsOfFriends = Set::extract('/Friend/Post/.', $user);