@ nielsiano Methoden funktionieren werden, aber sie werden Abfrage DB für jedes Benutzer/Produkt-Paar, was meiner Meinung nach eine Verschwendung ist.
Wenn Sie nicht wollen, alle zugehörigen Modelle Daten laden, dann ist es das, was ich für einen einzelnen Benutzer tun würde:
// User model
protected $productIds = null;
public function getProductsIdsAttribute()
{
if (is_null($this->productsIds) $this->loadProductsIds();
return $this->productsIds;
}
public function loadProductsIds()
{
$this->productsIds = DB::table($this->products()->getTable())
->where($this->products()->getForeignKey(), $this->getKey())
->lists($this->products()->getOtherKey());
return $this;
}
public function hasProduct($id)
{
return in_array($id, $this->productsIds);
}
Dann können Sie einfach tun:
$user = User::first();
$user->hasProduct($someId); // true/false
// or
Auth::user()->hasProduct($someId);
Nur 1 Abfrage wird ausgeführt, dann arbeiten Sie mit dem Array.
wäre der einfachste Weg, contains
wie @alexrussell vorgeschlagen werden.
Ich denke, dies ist eine Frage der Präferenz, also wenn Ihre App ist ziemlich groß und erfordert eine Menge Optimierung, können Sie wählen, was Sie leichter zu arbeiten finden.
+1. Dies ist der offizielle Weg und sollte als beste Antwort markiert werden. – Arda
Methode existiert nicht in 4.2 in equeststomany – DavidMIRV
@DavidMIRV erhalten Sie diesen Fehler aus dem oberen Codebeispiel? Wenn ja, bist du sicher, dass du die Beziehung als Attribut nennst? Wenn Sie es als Methodenaufruf tun (d. H. '$ Exists = $ client-> products() -> enthält ($ product_id);') dann wird es tatsächlich sagen, dass 'contains' nicht in' BelongsToMany' existiert. Wenn Sie es jedoch als Attribut bezeichnen, wird das BelongsToMany automatisch in eine Collection konvertiert, die * contains() 'enthält. – alexrussell