2016-08-06 25 views
0

finde ich eine benutzerdefinierte Funktion aufbauen wollen Passing, die Bands für ein bestimmtes Genre ruft, ich habe dies versucht, aber die Funktion auf den Parameter nicht zugreifen können $genre:einen Parameter zu einer benutzerdefinierten Methode find in cakephp 3.x

public function findGenre(Query $query, array $options) 
{ 

    $genre = $options['genre']; 
    $bands = $this->find()->contain([ 
     'Genres' => function($q){ 
      return $q->where(['Genres.id' => $genre]); 
     } 
    ]); 
    return $bands; 
} 

ich die $genre außerhalb der contain() Methode zugreifen kann, aber innen ist es nicht. Meine Frage ist, wie kann ich die $genre var an die function($q) innerhalb der contain-Methode übergeben.

+0

Welche Fehler wird Ihr Code, den Sie geben? Ist Ihnen bekannt, dass Ihr Code normalerweise $ bands = $ query-> contain ([...]); enthalten sollte, damit er auf eine bestehende Abfrage angewendet werden kann? –

+0

Die Abfrage funktioniert gut, wenn ich keine Bedingung verwende, aber wenn ich die Bedingung mit dem Parameter hinzufüge, kann sie nicht auf den Parameter '$ genre' zugreifen, ich habe dem Beitrag eine Bearbeitung hinzugefügt –

Antwort

0

Ich fand, wo das Problem ist, ich das Stichwort use nach dem function($q) verwenden musste, so dass ein Teil des Codes wie dieses auch

$bands = $this->Bands->find()->contain('Genres', function($q) use ($genre){ 
    return $q->where(['Genres.name'=>$genre]); 
}); 

aussehen wird, kehrt die contain() Methode alle Daten, auch wenn Die Bands gehören nicht zu einem Genre, aber als ich es mit matching() ersetzte, funktionierte es gut.

Ich hoffe, dass dies jedem helfen wird, der ein ähnliches Problem in der Zukunft hat.

0

Ich hatte das gleiche Problem, aber jetzt ist es gelöst. Ich werde Ihnen Schritt für Schritt erklären:
Meine Tabellen sind:
Artikel: id, name, status, created
tags: id, name, status, created
articles_tags: id, article_id, tag_id

mein Abfrage ist dies:

Ich möchte meineübergebenin passender Variable aber direkt diese Variable funktioniert nicht in Abfrage. Also setze ich einfach $uses Variable und jetzt funktioniert es richtig.

$uses = $tag_data['slug']; 
$contain_article = ['Tags']; 
$query = $this->Articles->find('All') 
    ->where(['Articles.status' => '1']) 
    ->contain($contain_article) 
    ->matching('Tags', function ($q) use ($uses) { 
     return $q->where(['Tags.slug' => $uses]); 
    }); 

Bitte versuchen Sie dies :-)