2016-08-02 19 views
1

Im einen zufälligen Eintrag aus einer Tabelle und ihrer Verbände zu erhalten versuchen.Sequelize erhalten zufälligen Eintrag mit Verein und Grenze „fehlt FROM-Klausel Eintrag

Recipe.findAll({ 
order: [ 
    [sequelize.fn('RANDOM')] 
], 
where: { 
    '$RecipeCategory.name$': category 
}, 
include:[ 
{ 
    model: models.Category, 
    as: 'RecipeCategory', 
},{ 
    model: models.Product, 
}], 
subQuery:false, 
limit:1}) 

Mit dem obigen Code, den ich einen zufälligen Eintrag bekommen von Rezept und seine Assoziationen mit Limit 1. beispiels~~POS=TRUNC weise~~POS=HEADCOMP gibt es nur 1 Produkt und ich brauche alle Produkte. I ein Rezept mit allen Produkten erhalten müssen.

Irgendwelche Vorschläge?

Wenn ich die Unterabfrage Option entfernen Ich erhalte das: Sequel iseDatabaseError: fehlende FROM-Klausel Eintrag für Tabelle "RezeptCategory"

Ich suche 5 Tage nach der Lösung und ich denke, dass ich alle zugehörigen Antworten in diesem überprüfen.

bearbeitet. Generierte Abfrage

SELECT "Recipe"."id", "Recipe"."name", "Recipe"."description", "Recipe"."pic", "Recipe"."createdAt", "Recipe"."updatedAt", "RecipeCategory"."id" AS "RecipeCategory.id", "RecipeCategory"."name" AS "RecipeCategory.name", "RecipeCategory"."description" AS "RecipeCategory.description", "RecipeCategory"."createdAt" AS "RecipeCategory.createdAt", "RecipeCategory"."updatedAt" AS "RecipeCategory.updatedAt", "RecipeCategory.Recipes_Categories"."createdAt" AS "RecipeCategory.Recipes_Categories.createdAt", "RecipeCategory.Recipes_Categories"."updatedAt" AS "RecipeCategory.Recipes_Categories.updatedAt", "RecipeCategory.Recipes_Categories"."CategoryId" AS "RecipeCategory.Recipes_Categories.CategoryId", "RecipeCategory.Recipes_Categories"."RecipeId" AS "RecipeCategory.Recipes_Categories.RecipeId", "Products"."id" AS "Products.id", "Products"."name" AS "Products.name", "Products"."protein" AS "Products.protein", "Products"."fat" AS "Products.fat", "Products"."carbohydrates" AS "Products.carbohydrates", "Products"."salt" AS "Products.salt", "Products"."min" AS "Products.min", "Products"."max" AS "Products.max", "Products"."vegan" AS "Products.vegan", "Products"."piece" AS "Products.piece", "Products"."createdAt" AS "Products.createdAt", "Products"."updatedAt" AS "Products.updatedAt", "Products.Product_Recipe"."position" AS "Products.Product_Recipe.position", "Products.Product_Recipe"."createdAt" AS "Products.Product_Recipe.createdAt", "Products.Product_Recipe"."updatedAt" AS "Products.Product_Recipe.updatedAt", "Products.Product_Recipe"."ProductId" AS "Products.Product_Recipe.ProductId", "Products.Product_Recipe"."RecipeId" AS "Products.Product_Recipe.RecipeId" 
FROM 
    "Recipes" AS "Recipe" 
    LEFT OUTER JOIN (
     "Recipes_Categories" AS "RecipeCategory.Recipes_Categories" 
     INNER JOIN 
     "Categories" AS "RecipeCategory" ON "RecipeCategory"."id" = "RecipeCategory.Recipes_Categories"."CategoryId" 
    ) ON "Recipe"."id" = "RecipeCategory.Recipes_Categories"."RecipeId" 
    LEFT OUTER JOIN (
     "Product_Recipes" AS "Products.Product_Recipe" 
     INNER JOIN "Products" AS "Products" ON "Products"."id" = "Products.Product_Recipe"."ProductId" 
    ) ON "Recipe"."id" = "Products.Product_Recipe"."RecipeId" 
WHERE "RecipeCategory"."name" = 'meal-3' 
ORDER BY RANDOM() 
LIMIT 1; 
+0

Konsole protokollieren Sie die Abfrage und fügen Sie die console.log in Ihre Frage ein. Anweisungen zur Protokollierung Ihrer Abfragen finden Sie unter diesem Link http://stackoverflow.com/questions/21427501/how-cani-i-see-the-sql-generated-by-sequelize-js –

+0

getan, danke –

Antwort

0

Es sieht aus wie ein include auf der gleichen Ebene mit wie where nicht wie von this Gewinden im Jahr 2015 unterstützt wird Es ist nicht klar, was die Lösung in Ihrem Fall wäre

ein relavant Zitat aus dem oben genannten Thread von einem sequelize Beitrag:

include.where won't since you need a negative query. You could probably try a raw where. .and({filter_level: ...}, ['RAW QUERY']})

On a side note .. Für den Fall, dass Sie nicht bereit sind, Sequelize zu verwenden, empfehle ich persönlich die Verwendung von knex.js. Ich benutze es im Produktionscode. Es ist eine gut ausgewogene Bibliothek. Sie erhalten viel Flexibilität/Benutzerfreundlichkeit eines ORM wie Sequelize, ohne zu viel Sicht/Kontrolle der Abfrage selbst zu verlieren. Es ist sehr einfach, rohe Abfragen hinzuzufügen/auszuführen, wenn die Bibliothek das, was Sie tun, nicht unterstützt.

Das ist ziemlich rau, weil ich bin mir ziemlich sicher, dass entweder Sequelize dies überkomplizentieren oder Ihre Datenbankstruktur ist zu kompliziert. Diese sollte nicht 4 Joins erfordern! Hier ist die allgemeine Idee:

  1. nehmen Ihre db Auto incrememts die Rezepte ID

  2. get Anzahl von Rezepten von Rezepten Tabelle, mit COUNT()

  3. eine Zufallszahl zwischen 0 und COUNT erzeugen(), das ist die ID Ihres zufälligen Rezepts

  4. Abfrage die Rezepttabelle für für das Rezept, links beitreten auf der Produkttabelle zu bekommen, beitreten Rezept ID. Dies ist eine einfache Abfrage, die einfach in Knex geschrieben werden kann.

  5. Gewinn! Sie haben jetzt ein zufälliges Rezept und alle Produkte, die für das Rezept benötigt werden.