Mikail.Net

Yazılımcı günlüğü

Eager Loading

Bu örnekte, Post kaynağında user ilişkisini her zaman eager load etmeye yönlendiren public static $with = ['user']; satırını ekledik. Böylece, Subtitle alanında user ilişkisine erişirken, performansı artırmak için ilişki her zaman eager load edilir. Bu, özellikle büyük veri kümesi ile çalışırken önemlidir, çünkü gereksiz veritabanı sorgularının sayısını azaltır.

Öncelikle, modellerinizi oluşturarak başlayalım.

User modeli:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;

    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

Post modeli:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Şimdi, Post ve User modelleri için Nova kaynakları oluşturalım.

Post kaynağı:

namespace App\Nova;

use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\BelongsTo;

class Post extends Resource
{
    public static $model = \App\Models\Post::class;

    public static $with = ['user'];

    public function fields(Request $request)
    {
        return [
            ID::make(__('ID'), 'id')->sortable(),

            BelongsTo::make('User'),

            Text::make('Title')
                ->sortable()
                ->rules('required', 'max:255'),

            Text::make('Subtitle', function () {
                return 'Author: ' . $this->user->name;
            }),
        ];
    }
}

User kaynağı:

namespace App\Nova;

use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\HasMany;

class User extends Resource
{
    public static $model = \App\Models\User::class;

    public function fields(Request $request)
    {
        return [
            ID::make(__('ID'), 'id')->sortable(),

            Text::make('Name')
                ->sortable()
                ->rules('required', 'max:255'),

            HasMany::make('Posts'),
        ];
    }
}