2016-08-17 3 views
0

Ich arbeite an CakePHP 3.2.CakePHP: Abfrage der gleichen Werte zweimal

ich categories haben, products, seller_products Tisch und ihre Vereinigung sind

categories->hasMany('Products'); 
seller_products->hasMany('Products'); 

ich alle Produkte Gruppe nach Kategorie abrufen, wo seller_products.stock> 0

Das ist, was ich tue

$pros1 = $this->Products->Categories->find() 
      ->where([ 
      'Categories.status' => 0, 
      ]) 
      ->contain([ 
      'Products.SellerProducts', 'Subcategories', 'Subcategories.ProductTypes' 
      ]) 
      ->matching('Products.SellerProducts', function(\Cake\ORM\Query $q) { 
      return $q->where(['SellerProducts.stock >' => 0]); 
      }); 

aber beim Debuggen gibt es die gleichen Werte zweimal zurück. foreach($pros1 as $p){debug($p);} gleiche Werte zweimal

/src/Controller/PagesController.php (line 120) 

object(App\Model\Entity\Category) { 

    'id' => (int) 1, 
    'title' => 'Electronics', 
    'description' => '', 
    'icon' => 'fa-television', 
    'status' => (int) 0, 
    'created' => object(Cake\I18n\Time) { 
     ......... 
    } 

/src/Controller/PagesController.php (line 120) 

object(App\Model\Entity\Category) { 

    'id' => (int) 1, 
    'title' => 'Electronics', 
    'description' => '', 
    'icon' => 'fa-television', 
    'status' => (int) 0, 
    'created' => object(Cake\I18n\Time) { 
     ......... 
    } 
drucken

und debug(count($pros1)) Druck 1

Antwort

1

Zitat aus der Dokumentation: Aufruf distinct auf ein INNER JOIN, mögen Sie vielleicht

Da diese Funktion berücksichtigt werden erstellen die Suchabfrage, da Sie möglicherweise doppelte Zeilen erhalten, wenn Ihre Bedingungen sie nicht bereits ausschließen. Dies kann der Fall sein, zum Beispiel, wenn die gleichen Benutzer mehr als einmal auf einen einzelnen Artikel kommentieren.

Cookbook > Database Access & ORM > Query Builder > Filtering by Associated Data

In Ihrem Fall gibt es mehrere passende Produkte, die zu der gleichen Kategorie gehören. Verwenden Sie also entweder einen eindeutigen Select für den Primärschlüssel der Tabelle oder gruppieren Sie ihn (there may be no difference between the two).

$pros1 = $this->Products->Categories 
    ->find() 
    ->distinct('Categories.id') 
    // ... 
// ... 
    ->matching(/* ... */) 
    ->group('Categories.id'); 

Siehe auch

+0

danke ndm. aber das Anpassen funktioniert nicht. Es zeigt immernoch Produkte mit 'SellerProducts.stock = 0' –

+0

@AnujTBE Das ist eine andere Frage. So funktioniert das nicht. Matching filtert die übergeordneten Datensätze, wenn Sie untergeordnete Datensätze ("SellerProducts") enthalten und nur bestimmte Datensätze wünschen, müssen Sie diese ebenfalls filtern. Siehe ** http: //stackoverflow.com/a/26800203/1392379** – ndm

Verwandte Themen