2013-10-24 4 views
13

Ich habe einige berechnen in einer Ansichtstabelle für Produkte in MYSQL, also liste ich diese ID für die Produktreferenz ID.So bestellen Sie, wo in Felder in Laravel

$referenceIds = viewTable::orderBy('score', 'DESC')->lists('product_id'); 

Und ich möchte das Produkt von dieser Referenz-ID erhalten.

$products = Product::whereIn('id', $rederenceIds); 

Das Produkt Inhalt ist richtig, aber die Reihenfolge ist falsch, wie Produktauftrag von Referenz-ID zu laden, ich weiß, ich es in MySQL tun kann ORDER BY FIELD(id,' . $fields . ') durch, aber ich mag Laravel Weg, um herauszufinden, und hoffe nicht ORDER BY FIELD Befehl verwenden, weil es zu viel Datenbankeffizienz zu verschwenden scheint.

+0

Als Endergebnis versuchen Sie, die Produkte oder die referenceIds zu bestellen? –

+4

'orderBy (DB :: roh ('FIELD (id,'. Implode (',', $ productStarScoreIds). ')'), 'ASC')', das ist die Lösung, aber ich möchte Laravel Lösung herausfinden wenn möglich. – Chan

Antwort

0

nicht sicher, ob ich das ganz verstehen, aber wenn Sie die bestellten Produkte wollen, sollten Sie

$referenceIds = viewTable::lists('product_id'); 

$ordered_products = Product::whereIn('id', $rederenceIds)->orderBy('id', 'DESC')->get(); 
+0

Ich möchte nach Referenz-Produkt-ID, nicht das Ergebnis Produkt-ID bestellen. – Chan

10

verwenden Sie werden einige rohe SQL injizieren müssen, aber es ist nicht ein Alptraum:

$referenceIds = viewTable::orderBy('score', 'DESC')->lists('product_id'); 
$referenceIdsStr = implode(',', $referenceIds); 
$products = Product::whereIn('id', $rederenceIds)->orderByRaw(DB::raw("FIELD(product_id, $referenceIdsStr)"))->get()->all(); 
+4

Wenn Sie bereits 'orderByRaw' verwenden, müssen Sie' DB :: raw' nicht verwenden. –

0

Wenn der Schlüssel primay Schlüssel (ich glaube, in dieser Frage ist es ...) ist, können Sie dies versuchen:

$products = Product::whereIn('id', $rederenceIds)->get(); 
$products = array_replace(array_flip($rederenceIds), $products->getDictionary()); 

die r esult ist Array, nicht Sammlung.

Ich weiß nicht, ob es ein Effizienzproblem hat, aber Reihenfolge für Feld hat andere Probleme. Zum Beispiel wird die Sortierung nach Feld von sqlite nicht unterstützt, so dass es beim Testen mit der In-Memory-Datenbank nicht funktioniert.