2016-11-24 2 views
1

I cakePHP3 Query Builder verwende folgende Abfrage zu holen Datensätze aus zwei Tabellen, in denen ich alle Spalten aus Tabelle 1 und ausgewählte Spalten aus table2 wollen.cakephp 3 holen alle durch Tabelle mit *

$this->loadModel('Table1'); 
$Table1 = $this->Table1->find('all', array('fields' => array('Table1.*'),'conditions'=>$conditions,'order'=>array('Table1.id'=>'DESC')))->contain(['Table2']); 

Aber ich bekomme ich den folgenden Fehler

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `Table1__*` FROM Table1 Table1 LEFT JOIN Table2 Table2 ON ' at line 1 

Ich bin neu in CakePHP3.

+0

bitte auf die korrekte Syntax verweisen: '$ this-> Table1-> finden ('alle', array ( 'joins' => array ( array ( 'tabelle' => 'table1', 'alias' => 'Tisch', 'Typ' => 'innerer', 'Bedingungen' => array ( 'table1.id = table2.id' ) ) ), 'Bedingungen' = > $ conditions, 'fields' => array ('table1. *', 'table2.field1, table2.field2'), )); ' –

+0

Mit Ihrem Code bekomme ich diesen Fehler:' Fehler: SQLSTATE [42000 ]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax in der Nähe von "AS" Table1 __ * ', Table2.field1, Table2.field2 AS Table2__field1, Prod 'at line 1' entspricht – Mona

+0

Sieht so aus, als ob CakePHP' nicht umgehen kann. * ' – simon

Antwort

4

warum nicht Query Builder verwenden?

gibt es viele Möglichkeiten zu tun, dass

$query= $this->Table1->find('all') 
    ->where($conditions) 
    ->order(['Table1.id'=>'DESC']) 
    ->contain(['Table2' => [ 
      'fields' => ['field1', 'field2'] 
     ] 
    ]); 

oder

$query= $this->Table1->find('all') 
    ->select($this->Table1) // selects all the fields from Table1 
    ->select(['Table2.field1', 'Table2.field2']) // selects some fields from Table2 
    ->where($conditions) 
    ->order(['Table1.id'=>'DESC']) 
    ->contain(['Table2']); 

oder

$query= $this->Table1->find('all') 
    ->where($conditions) 
    ->order(['Table1.id'=>'DESC']) 
    ->contain(['Table2' => function($q) { 
      return $q->select(['field1', 'field2']); 
     } 
    ]); 
+0

In diesem Fall nicht notwendig, aber alle Felder von 'Table1' wären sowieso ausgewählt. Sound Smore wie das OP sucht nach einer Begrenzung der Felder des Containments, zB' Table2'. – ndm

+0

@ndm in der Tat select ($ this-> Table1) 'um zu vermeiden, dass alle Felder aus Table2 – arilia

+0

Ja, aber das wird dazu führen, dass die Assoziation nicht in den Ergebnissen enthalten ist, was nicht zu viel Sinn ergibt;) Soweit ich das verstehe OP möchte einige spezifische Felder von 'Table2'. – ndm

-2

die korrekte Beziehung zwischen Tabellen

Beispiel Bedingungen Array

Angenommen
$conditions = ['Table2.id' > 1]; 

Auswählen von Zeilen aus einer Tabelle

$table1 = $this->Table1->find()->select(['Table1.*'])->where($conditions)->contain(['Table2'])->order(['Table1.id'=>'DESC'])->toArray(); 

OR

$table1 => $this->Table1->find('all', array(
    'contain' => ['Table2'], 
    'conditions' => $conditions, 
    'fields' => ['Table1.*'], 
    'order' => ['Table1.id'=>'DESC'] 
)); 

hier haben Sie weitere Informationen über queryBuilder

+0

Auch nach dem Ändern der Abfrage, wie von Ihnen vorgeschlagen (@Jacek), bekomme ich immer noch den gleichen Fehler! :( – Mona