2015-05-23 23 views
14

CakePHP 3.x kullanıyorum.CakePHP 3 kullanarak birden çok tabloya nasıl katılırsınız?

Ne istediğim $ this-> Kategoriler-> find() öğesini aramak ve sonra Topics on Topics.cat_id = Kategoriler.id öğesine üye olmak ve Posts.topic_id = Topics.id üzerindeki gönderilere katılmak.

Hata görmüyorum, ancak geri döndüğüm tek veri, Kategoriler verileridir, LEFT ve INNER denemeyi denemedim. Herhangi bir yardım büyük takdir edilecektir.

tablo ilişkileri şunlardır:

CategoriesTable

$this->hasMany('Topics'); 

TopicsTable

$this->belongsTo('Categories'); 
$this->hasMany('Posts'); 

PostsTable Ayrıca

$this->belongsTo('Topics'); 

sorgu i vardır:

$query = $this->Categories->find('all') 
     ->order(['Categories.name' => 'ASC']) 
     ->join([ 
      'topics' => [ 
       'table' => 'Topics', 
       'type' => 'LEFT', 
       'conditions' => 'topics.Cat_id = Categories.id' 
      ], 
      'posts' => [ 
       'table' => 'Posts', 
       'type' => 'LEFT', 
       'conditions' => 'posts.topic_id = topics.id' 
      ] 
     ]); 

bu sorguyu kullanarak "Yayınlar ilişkili değildir Kategoriler" containable davranışı kullanarak ama şimdi hata alıyorum çalıştı: danışma @ndm ile

$query = $this->Categories->find('all') 
     ->order(['Categories.name' => 'ASC']) 
     ->contain(['Topics', 'Posts' => function($q){ 
      return $q->where(['Posts.topic_id' => 'Topics.id']); 
     }]); 
+1

Manuel eklemeler değil, içerik arıyorsunuz. ** http: //book.cakephp.org/3.0/en/orm/query-builder.html#loading-associations** – ndm

+1

@ndm Yanıt için teşekkür ederiz. Sorguları, sonuçları kullanarak herhangi bir öneri kullanarak sonuçlarımı güncelledim mi? – Wisd0m

+1

İç içe geçmiş ilişkileri tanımlamaya daha yakından bakın. – ndm

cevap

16

i elde edebildi verdi sonuç istedim. Dokümanlardaki bölümü gözden kaçırmış olmalıyım, yani bu sorunu yaşayan başka herkes, işte nasıl yapılacağı.

$query = $this->Categories->find('all') 
     ->order(['Categories.name' => 'ASC']) 
     ->contain([ 
      'Topics.Posts.Users' 
     ]); 
+0

-> içerir (['Topics.Posts.Users' Bunu yapabileceğiniz hakkında hiçbir fikrim yoktu, bunu anlamaya çalışırken bütün bir gün geçirdim. –

+0

Günümü kurtarırsınız! Teşekkürler –

-3

bu deneyin:

$query = $this->Categories->find('all') 
     ->fields('Categories.*', 'Topics.*', 'Posts.*') 
     ->order(['Categories.name' => 'ASC']) 
     ->join([ 
      'topics' => [ 
       'table' => 'Topics', 
       'type' => 'LEFT', 
       'conditions' => 'topics.Cat_id = Categories.id' 
      ], 
      'posts' => [ 
       'table' => 'Posts', 
       'type' => 'LEFT', 
       'conditions' => 'posts.topic_id = topics.id' 
      ] 
     ]); 

bu satırı ekleyin:

->fields('Categories.*', 'Topics.*', 'Posts.*') 

Sadece cakephp2 mirası tür bulmak Konu verileri ve Mesajlar

+4

Bu pek işe yaramaz nedenleri, 'alanları()' diye adlandırılan bir yöntem yoktur, alanların seçimi 'select()' ile yapılır, ancak '. *' ORM sorgu oluşturucu tarafından desteklenmez, aynı şekilde takma ad ile geçersiz SQL sonuçlanır. Dahil olmayan derneklerdeki ek alanlar hidrate edilmeyecek ve 1: n ilişkiler, vb. olduğu için yinelenen sonuçlar elde edeceksiniz ... – ndm

2

almak için, size hala eski sürüm gibi birleştirme kullanabilirsiniz.

$result = $this->Category->findAll(fields=>['id','Topic.id'], 'conditions'=>['Topic.name'=>'s'],'join'=>['Topic' => [ 
      'table' => 'topics', 
      'type' => 'INNER', 
      'conditions' => 'Topic.category_id = Category.id' 
     ]]); 

Tanıdık? hala alias'i

gibi kullanabiliyorsunuz. İlk defa cevap, kod editörünün nasıl çalıştığından emin değil, üzgünüm.

+0

'join()' yönteminin orada olduğunun farkında değildim. İşaret ettiğin için teşekkürler. – Parixit

İlgili konular