Ich habe zwei Tabellen: listings
, die die Details eines Produkts enthält, und bids
, die das Gebotsverlauf der Website enthält.Laravel Eloquenz mit dem Maximum in der zweiten Tabelle?
Für kurze Relevanz vorstellen, dass listings
die folgenden Felder hat:, category_id, Tagline, short_description und seller_notes Name.
In bids
haben wir zwei relevante Bereiche: listing_id und bid_amount.
Aus Gründen an anderer Stelle relevant, muss dies in Eloquent sein, wie ich Zugriff auf das Modell benötigen.
Das Problem scheint mit der MAX
Gebotsbetrag Linie oder der Bewertung der bid_amount
-kein ganz gleich, wie ich Ansatz, ich immer mit einem irrelevanten Ergebnis am Ende zu sein, aber es gibt keinen offensichtlichen Fehler, die ich sehen kann.
$listings = \App\Listing::join('bids', 'listings.id', '=', 'bids.listing_id')->select('listings.*','MAX(bids.bid_amount)');
if(!empty($request->keyword)) {
$listings = $listings->where('listings.name','LIKE','%'.$request->keyword.'%')
->orWhere('listings.tagline','LIKE','%'.$request->keyword.'%')
->orWhere('listings.short_description','LIKE','%'.$request->keyword.'%')
->orWhere('listings.seller_notes','LIKE','%'.$request->keyword.'%');
}
if(!empty($request->category)) {
$listings = $listings->where('listings.category_id','=',$request->category);
}
if(!empty($request->minimum_bid) && !empty($request->maximum_bid)) {
$listings = $listings->whereBetween('bid_amount', [$request->minimum_bid, $request->maximum_bid]);
} else {
if(!empty($request->minimum_bid)) {
$listings = $listings->where('bid_amount', '>', $request->minimum_bid);
}
if(!empty($request->maximum_bid)) {
$listings = $listings->where('bid_amount', '<', $request->maximum_bid);
}
}
Die Suche ist Ergebnisse mit einem aktuellen Höchstgebot zwischen minimum_bid
und maximum_bid
(Feldern aus dem Suchfeld) zu finden. Das Problem besteht darin, dass es mehrere Einträge (listing_id
) geben kann, die zwischen diesen Beträgen ein aktuelles Höchstgebot (MAX(bid_amount)
) haben. Ich möchte die Einträge anzeigen, wo die MAX(bid_amount)
für diese bid.listing_id
zwischen minimum_bid
und maximum_bid
ist. Dies könnte möglicherweise zu mehreren Auflistungen führen.
Die äquivalente sollte MySQL-Abfrage sein:
SELECT *
FROM listings
JOIN (SELECT listing_id,
Max(bid_amount) AS bid_amount
FROM bids
GROUP BY listing_id) bids
ON bids.listing_id = listings.id
WHERE (listings.NAME LIKE '%keyword%'
OR listings.tagline LIKE '%keyword%'
OR listings.short_description LIKE' %keyword%'
OR listings.seller_notes LIKE '%keyword%')
AND (bids.bid_amount > minimum_bid)
AND (bids.bid_amount < maximum_bid)
Ich weiß, das ist etwas dumm, dass ich falsch, mache ich gerade wirklich einen frischen Satz Augen benutzen konnte. Vielen Dank für Ihre Hilfe.
Hat die Liste bid_id? Ich bin verwirrt von Ihrer Tischstruktur. Sie treten der Listentabelle nach bids.id bei. 'listing.id = bids.id'? –
Jetzt macht das Verbinden Sinn. Komm auf die nächste Frage. Was genau willst du?Beitritt basierend auf einem maximalen Gebotsbetrag pro Angebot oder Sie möchten einen einzelnen Datensatz mit einem maximalen Gebotsbetrag und Listing Details? –
Sie möchten die MAX (bid_amount) -Liste von minimum_bid und maximum_bid Filter anzeigen, ist das korrekt? –