<h3>
    <a name="laravel-13style-model-configuration-with-attributes" href="#laravel-13style-model-configuration-with-attributes">
    </a>
    Laravel 13 tarzında özellikleri ile model yapılandırması
</h3>

<p>İşte model tekrar (bu, CRUD'in "Laravel 13" kısmıydı):</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="cp"><?php </span?>

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Visible;
use Illuminate\Database\Eloquent\Attributes\Scope;

#[Fillable([‘name’, ‘price_cents’, ‘is_active’])]
#[Visible([‘id’, ‘name’, ‘price_cents’, ‘is_active’])]
class Product extends Model
{
#[Scope]
protected function search(Builder $query, string $q): void
{
$query->where(<span class=”s1>’name’, <span class=”s1>’like’, <span class=”s2′>”%{$q}<span class=”s2′>%”);
}
}

<h3>
    <a name="controller-pagination-search" href="#controller-pagination-search">
    </a>
    Denetleyici (sayfalama + arama)
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="cp"><?php </span?>

namespace App\Http\Controllers;

use App\Http\Requests\StoreProductRequest;
use App\Http\Requests\UpdateProductRequest;
use App\Models\Product;
use Illuminate\Http\Request;
use Inertia\Inertia;

class ProductController extends Controller
{
public function index(Request $request)
{
$q = $request->string(<span class=”s1>’q’)->toString();

    <span class="nv">$products</span> <span class="o">=</span> <span class="nc">Product</span><span class="o">::</span><span class="nf">query</span><span class="p">()</span>
        <span class="o">-&gt;</span><span class="nf">when</span><span class="p">(</span><span class="nv">$q</span> <span class="o">!==</span> <span class="s1>''</span><span class="p">,</span> <span class="k">fn</span> <span class="p">(</span><span class="nv">$query</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nv">$query</span><span class="o">-&gt;</span><span class="nf">search</span><span class="p">(</span><span class="nv">$q</span><span class="p">))</span> <span class="c1">// özellik kapsamı</span>
        <span class="o">-&gt;</span><span class="nf">latest</span><span class="p">()</span>
        <span class="o">-&gt;</span><span class="nf">paginate</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
        <span class="o">-&gt;</span><span class="nf">withQueryString</span><span class="p">();</span>

    <span class="k">return</span> <span class="nc">Inertia</span><span class="o">::</span><span class="nf">render</span><span class="p">(</span><span class="s1>'Products/Index'</span><span class="p">,</span> <span class="p">[</span>
        <span class="s1>'products'</span> <span class="o">=&gt;</span> <span class="nv">$products</span><span class="p">,</span>
        <span class="s1>'filters'</span> <span class="o">=&gt;</span> <span class="p">[</span>
            <span class="s1>'q'</span> <span class="o">=&gt;</span> <span class="nv">$q</span><span class="p">],</span>
    <span class="p">]);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">function</span> <span class="n">create</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="nc">Inertia</span><span class="o">::</span><span class="nf">render</span><span class="p">(</span><span class="s1>'Products/Create'</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">function</span> <span class="n">store</span><span class="p">(</span><span class="kt">StoreProductRequest</span> <span class="nv">$request</span><span class="p">)</span>
<span class="p">{</span>
    <span class="nc">Product</span><span class="o">::</span><span class="nf">create</span><span class="p">(</span><span class="nv">$request</span><span class="o">-&gt;</span><span class="nf">validated</span><span class="p">());</span>

    <span class="k">return</span> <span class="nf">redirect</span><span class="p">()</span>
        <span class="o">-&gt;</span><span class="nf">route</span><span class="p">(</span><span class="s1>'products.index'</span><span class="p">)</span>
        <span class="o">-&gt;</span><span class="nf">with</span><span class="p">(</span><span class="s1>'success'</span><span class="p">,</span> <span class="s1>'Ürün oluşturuldu.'</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">function</span> <span class="n">edit</span><span class="p">(</span><span class="kt">Product</span> <span class="nv">$product</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="nc">Inertia</span><span class="o">::</span><span class="nf">render</span><span class="p">(</span><span class="s1>'Products/Edit'</span><span class="p">,</span> <span class="p">[</span>
        <span class="s1>'product'</span> <span class="o">=&gt;</span> <span class="nv">$product</span><span class="o">-&gt;</span><span class="nf">only</span><span class="p">(</span><span class="s1>'id'</span><span class="p">,</span> <span class="s1>'name'</span><span class="p">,</span> <span class="s1>'price_cents'</span><span class="p">,</span> <span class="s1>'is_active'</span><span class="p">),</span>
    <span class="p">]);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">function</span> <span class="n">update</span><span class="p">(</span><span class="kt">UpdateProductRequest</span> <span class="nv">$request</span><span class="p">,</span> <span class="kt">Product</span> <span class="nv">$product</span><span class="p">)</span>
<span class="p">{</span>
    <span class="nv">$product</span><span class="o">-&gt;</span><span class="nf">update</span><span class="p">(</span><span class="nv">$request</span><span class="o">-&gt;</span><span class="nf">validated</span><span class="p">());</span>

    <span class="k">return</span> <span class="nf">redirect</span><span class="p">()</span>
        <span class="o">-&gt;</span><span class="nf">route</span><span class="p">(</span><span class="s1>'products.index'</span><span class="p">)</span>
        <span class="o">-&gt;</span><span class="nf">with</span><span class="p">(</span><span class="s1>'success'</span><span class="p">,</span> <span class="s1>'Ürün güncellendi.'</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">function</span> <span class="n">destroy</span><span class="p">(</span><span class="kt">Product</span> <span class="nv">$product</span><span class="p">)</span>
<span class="p">{</span>
    <span class="nv">$product</span><span class="o">-&gt;</span><span class="nb">delete</span><span class="p">();</span>

    <span class="k">return</span> <span class="nf">redirect</span><span class="p">()</span>
        <span class="o">-&gt;</span><span class="nf">route</span><span class="p">(</span><span class="s1>'products.index'</span><span class="p">)</span>
        <span class="o">-&gt;</span><span class="nf">with</span><span class="p">(</span><span class="s1>'success'</span><span class="p">,</span> <span class="s1>'Ürün silindi.'</span><span class="p">);</span>
<span class="p">}</span>

}

<h3>
    <a name="typescriptfriendly-inertia-pages" href="#typescriptfriendly-inertia-pages">
    </a>
    TypeScript'e dost Inertia sayfaları
</h3>

<p>Vue tarafında, en önemli şey form durumunuzu yazmak ve salt okunur özelliklerde <code>v-model</code> kullanmaktan kaçınmaktır.</p>

<p>Örnek form tipi:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight typescript"><code><span class="kd">type</span> <span class="nx">ProductForm</span> <span class="o">=</span> <span class="p">{</span>

name: string
price_cents: number
is_active: boolean
}

<p>Ve daha sonra:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight typescript"><code><span class="kd">const</span> <span class="nx">form</span> <span class="o">=</span> <span class="nx">useForm</span><span class="o"><span class="nx">ProductForm</span><span class="o">&gt;</span><span class="p">({</span>

name: ,
price_cents: 0,
is_active: true,
})

<hr/>

<h2>
    <a name="feature-2-reviews-eloquent-relations-inertia-pages" href="#feature-2-reviews-eloquent-relations-inertia-pages">
    </a>
    Özellik 2: Yorumlar (Eloquent ilişkileri + Inertia sayfaları)
</h2>

<p>CRUD'ün çalıştığına emin olduktan sonra, Eloquent ilişkilerini test etmek için <strong>yorumlar</strong> ekledim.</p>

<h3>
    <a name="database-shape" href="#database-shape">
    </a>
    Veritabanı yapısı
</h3>

<ul>
    <li>
        <code>products</code> 1—N <code>reviews</code>
    </li>
    <li>
        <code>customers</code> 1—N <code>reviews</code>
    </li>
    <li>eşsiz kısıtlama: <code>(product_id, customer_id)</code> her müşteri için bir üründe bir yorum sağlamaktadır</li>
</ul>

<p>Bu size şunları sağlar:</p>

<ul>
    <li>ilişki yükleme (<code>with('customer')</code>)</li>
    <li>toplamlar (<code>withCount</code>, <code>withAvg</code>)</li>
    <li>iç içe yönlendirme (<code>products/{product}/reviews</code>)</li>
</ul>

<h3>
    <a name="useful-eloquent-aggregate" href="#useful-eloquent-aggregate">
    </a>
    Kullanışlı Eloquent toplam
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="nc">Product</span><span class="o">::</span><span class="nf">query</span><span class="p">()</span>

->whereKey(<span class=”nv>$product->id)
->withCount(<span class=”s1>’reviews’)
->withAvg(<span class=”s1>’reviews’, <span class=”s1>’rating’)
->first();

<p>Bu tür bir sorgu, Laravel'in ORM'sinin gerçekten parladığı yerdir: anlamlı istatistikleri, her yere ham SQL yazmak zorunda kalmadan alırsınız.</p>

<hr/>

<h2>
    <a name="feature-3-polymorphic-media-one-table-multiple-parents" href="#feature-3-polymorphic-media-one-table-multiple-parents">
    </a>
    Özellik 3: Polimorfik medya (bir tablo, birden fazla ebeveyn)
</h2>

<p>Polimorfik bir ilişki, medyayı birden fazla modele (Ürün, Müşteri, Sipariş...) tek bir <code>media</code> tablosu kullanarak eklemenizi sağlar:</p>

<ul>
    <li><code>mediable_type</code></li>
    <li><code>mediable_id</code></li>
</ul>

<p>Migration yardımcısı:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="nv">$table</span><span class="o">-&gt;</span><span class="nf">morphs</span><span class="p">(</span><span class="s1>'mediable'</span><span class="p">);</span>

<p>Daha sonra:</p>

<ul>
    <li><code>Media</code> <code>morphTo()</code> kullanır</li>
    <li><code>Product</code> <code>morphMany(Media::class, 'mediable')</code> kullanır</li>
</ul>

<p>Bunun harika olmasının nedenleri:</p>

<ul>
    <li>bir <code>product_images</code>, <code>customer_avatars</code>, <code>order_files</code> gibi tablolara ihtiyacınız yoktur...</li>
    <li>Eloquent'te tek tip bir API alırsınız (<code>$model-&gt;media()-&gt;create(...)</code>)</li>
</ul>

<hr/>

<h2>
    <a name="running-the-app-backend-frontend" href="#running-the-app-backend-frontend">
    </a>
    Uygulamayı Çalıştırma (arka uç + ön uç)
</h2>

<p>İki terminal açın:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight shell"><code>php artisan serve

<div class="highlight js-code-highlight">
    <pre class="highlight shell"><code>pnpm dev

<p>Ya da her iki süreci başlatan bir <code>composer run dev</code> betiği ayarladıysanız, tek bir komutla başlatabilirsiniz.</p>

<hr/>

<h2>
    <a name="lessons-learned-the-honest-part" href="#lessons-learned-the-honest-part">
    </a>
    Öğrenilen Dersler (dürüst kısım)
</h2>

<ul>
    <li>
        <strong>Laravel 13 geliştirme dalı kullanılabilir</strong>, ancak bağımlılık uyuşmazlıklarını bekleyin. Eğer bir paket <code>^13</code> desteklemiyorsa, ya geçici olarak bırakın ya da geliştirme dalını kullanın.</li>
    <li>Laravel 13'ün yapımındaki en büyük kazanım, <strong>özelliklerle deklaratif yapılandırmadır</strong>. Bu, uygulamanızı yeniden yazmaz, ama büyüdükçe kod tabanınızı daha okunabilir hale getirir.</li>
    <li>Inertia, bu tür bir keşif için mükemmel bir eşleşmedir: Arka uç mantığını "Laravel-native" tutarken gerçek ekranlar hızlı bir şekilde oluşturabilirsiniz.</li>
</ul>

<hr/>

<h2>
    <a name="next-steps-if-you-want-to-push-the-orm-further" href="#next-steps-if-you-want-to-push-the-orm-further">
    </a>
    Sonraki adımlar (ORM'yi daha ileri taşımak istiyorsanız)
</h2>

<p>Eğer bu projeyi daha da iyi bir Eloquent oyun alanına dönüştürmek istiyorsanız:</p>

<ul>
    <li>ürün varyasyonları (Ürün → ÜrünVaryasyonu, seçenekler/değerler, karmaşık pivotlar)</li>
    <li>envanter &amp; stok hareketleri (işlemler + toplamlar)</li>
    <li>çok kiracılı alan belirleme (küresel alanlar + tenant_id)</li>
</ul>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş