2016-07-05 8 views
0

Ich habe es schwer, eine bestimmte MySQL-Abfrage in Knex zu replizieren (ich verwende Bookshelf als ORM). Die SQL-Abfrage selbst gibt den richtigen Datensatz zurück, wenn die Datenbank direkt im MySQL-Terminal abgefragt wird.Übersetzen Sie eine MySQL-Abfrage in Knex QueryBuilder Syntaxäquivalent?

MySQL Query:

SELECT processed_articles.*, publications.pub_name 
FROM processed_articles 
INNER JOIN processed_articles_trends ON processed_articles_trends.processed_article_id = processed_articles.id 
INNER JOIN publications ON publications.id = processed_articles.pub_id 
WHERE (processed_articles_trends.trend_id = 2); 

Knex Querybuilder:

knex.select(['publications.pub_name', 'processed_articles.*']) 
    .innerJoin('processed_articles_trends', 'processed_articles.id', 'processed_articles_trends.processed_article_id') 
    .innerJoin('publications', 'processed_articles.pub_id', 'publications.id') 
    .where('processed_articles_trends.trend_id', '=', 2); 

weiß, dass ich die Knex Syntax falsch ist, aber ich bin nicht sicher, wo (ich die Array-Syntax vermuten in Zeile 1 der Knex Abfrage ...) & kann nicht für das Leben von mir herausfinden, wie sonst das SQL zu übersetzen. Die Tabelle 'verarbeitete_Artikel_Trends' stellt eine Verbindungstabelle zwischen der Tabelle 'verarbeitete_Artikel' und der 'Trends' Tabelle dar.

Ich versuchte zunächst meine Bücherregal Modell-Definitionen und die ‚withRelated‘ Parameter, aber Bibliothek wurde eine Voodoo unter der Haube durchführt, die es schwierig gemacht für mich festzustellen, wie das Feld ziehen zurück ich von den 'Publikationen benötigen ' Tabelle.

Dankbar für alle Einsichten - vielen Dank.

Antwort

1
knex('processed_articles') 
    .innerJoin('processed_articles_trends', 'processed_articles.id', 'processed_articles_trends.processed_article_id') 
    .innerJoin('publications', 'processed_articles.pub_id', 'publications.id') 
    .where('processed_articles_trends.trend_id', '=', 2) 
    .select(db.raw('processed_articles.*')) 
    .select('publications.pub_name') 
+0

Danke Shriram. Aus Interesse, was war der Hauptfehler in meinem Ansatz? Was macht die Methode db.raw(), und wie wirkt sich die Reihenfolge dieser Anweisungen auf das Ergebnis aus? Danke vielmals! – lensvelt

+1

db.raw() wird verwendet, um die Abfrage generell hart zu codieren, die nicht mit knex erstellt werden kann. Ich bin mir nicht sicher, wie die Ordnung das Ergebnis beeinflusst. –