Eloquent İlişkilerinde Koşullu Sorgular

28 Mart 2018 Çarşamba günü PHP başlığında

Eloquent İlişkilerinde Koşullu Sorgular

Aşağıda verdiğim örnekte, Eloquent ile koşullu sorguların ne kadar basit kullanıldığından bahsettim. Örnek içeriği olarak fatura, fatura satırları ve stok kartı üçlüsü üzerinden gittim. Buna birçok yerde ihtiyaç duyulabilir; Kitap ve yazar ilişkilerinde, yorum ve gönderi ilişkilerinde vs.

Elimizde stok kartları (Stock), faturalar (Invoice) ve fatura satırları (InvoiceRow) adında üç adet model olduğunu varsayalım. Stok kartını görüntülemek istediğimizde stok bilgilerinin yanında, mevcut stoğun hangi faturalarda işlem gördüğünü de listelemek gerekecek. Faturalar ve fatura satırları modelleri şöyle olsun:

Invoice.php

// ...
use App\Models\InvoiceRow;

class Invoice extends Model
{
    public function rows()
    {
        return $this->hasMany(InvoiceRows::class);
    }
}

InvoiceRow.php

// ...
use App\Models\Stock;
use App\Models\Invoice;

class InvoiceRows extends Model
{
    public function stock()
    {
        return $this->belongsTo(Stock::class);
    }

    public function invoice()
    {
        return $this->belongsTo(Invoice::class);
    }
}

Yukarıda, Fatura ve fatura satırları modellerini ilişkilendirdik. Ek olarak fatura satırları modeliyle stok kartları modelini ilişkilendirdik. Her bir fatura satırının, bir faturaya ve bir stok kartına ait olduğunu ($this->belongsTo() metodu) söyledik.

StockController.php

// ...
use App\Models\Stock;
use App\Models\Invoice;

class StockController extends Controller
{
    // ...
    public function show($id)
    {
        $stock = Stock::findOrFail($id);
        $invoices = Invoice::with('rows')->whereHas('rows', function($query) use ($stock){
            $query->where('stock_id', $stock->id);
        })->orderBy('created_at', 'desc')->get();

        return view('stock.show', compact('stock', 'invoices'));
    }
}

Yukarıdaki kontrolcüde stok kartı görüntülemek istedik. $invoices değişkenine mevcut açmak istediğimiz stok kartının bulunduğu faturaların koleksiyonunu (listesini) getirttik. Burada anahtar metod whereHas metodu. Bu metod sayesinde sorgumuza bir şart koştuk. Dedik ki eğer fatura satırları arasında belirttiğimiz stok varsa faturaları getir.

Kolay gelsin.


Kaynakça


Yorumlar