2016-05-14 19 views
0

Im Grunde, was ich tun möchte, ist diese Abfrage mit builder cakephp 3 Abfrage schreiben:Vereinigung where-Klausel mit Array cakephp 3

SELECT * FROM question as q innerjoin answers as a where q.question = $question AND a.id NOT IN = $avoidedIDs 

Codes für Tabellenklasse

<?php 
namespace App\Model\Table; 


use Cake\ORM\Table; 
use App\Model\Entity\Comlib; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Validator; 
use Cake\ORM\TableRegistry; 

class ComlibsTable extends Table { 

public function initialize(array $config) { 
    parent::initialize($config); 
$this->table('questions'); 
// join the tables 
$this->hasMany('Answers' , [ 
'foreignKey' => 'question_id' 
]); 



    } 

public function LFA($live_req) { 
$query = $this->find()->where(['question' => $live_req])->contain(['Answers'])->LIMIT(6); 
$query = $query->toArray(); 

//include 5 answer 
return $query; 

    } 
    public function LFM($theid , $avoidedIDs, $question) 
    { 
    $query = $this->find()->where(['question' => $question])->contain(['Answers' => function($q){ 
    return $q 
    ->where(['Answers.id NOT IN' => $avoidedIDs]); 
    } 
    ]); 
    $query = $query->toArray(); 
    debug($query); 
    return $query; 

    } 
} 

die Fehler, die ich bekommen ist : Es konnte keine Bedingung mit einer leeren Werteliste für das Feld (Answers.id) generiert werden. aber wenn ich print_r ($ avectedIDs) bekomme ich die Werte, die ich übergeben, so bin ich sicher, dass $ vermiedeneIDs nicht leer ist, zumindest nicht aus contain function und das ist, was es komplizierter für mich macht, aber wenn ich ONE Nummer statt von meiner Variable wird es ausgeführt, wenn ich 1,2,3,4 noch setze, wird es nur die erste ausführen! Was mache ich in den letzten 2 Tagen falsch ????? Tnx für jede Hilfe

Antwort

0

Es ist, weil Sie versuchen, $ vermiedene IDs in einer anonymen Funktion (Closure) Aufruf verwenden, die dort nicht verfügbar ist.

Sie sollten es für die Funktion verfügbar machen.

->contain(['Answers' => function($q) use ($avoidedIDs){..} 

Verschlüsse können auch Variablen aus dem übergeordneten Bereich erben. Solche Variablen müssen an das Sprachkonstrukt übergeben werden.

http://www.php.net/manual/en/functions.anonymous.php