30.12.2020

Laravel Livewire Kullanarak Dinamik Seçime Bağlı Dropdown

Laravel

Merhaba,

Laravelde yeniyim ve bir süredir denemeler yapıyorum.

Daha önce Laravel 6 versiyonu için oluşturduğum masraf yönetim altyapısını Laravel 8 ve Livewire kullanarak yeniden yazıyorum.

Şimdi bir örnek uygulama üzerinden seçime bağlı droprown menu (dynamic dependent dropdown) yapımına geçelim.

Sponsorlar ve Projeler olmak üzere 2 tablomuz olsun. Her sponsorun birden çok projesi olabilir ve projeler de sponsora bağlıdır.

Sponsoru seçtiğim zaman sponsora ait projeleri getirip bu projeler içinden seçim yaptırmak istiyorum.

Bu iş için pek çok kaynak ve yönerge araştırdım ama çeşitli hatalarla karşılaştım. Çalışan iyileştirilmiş kodları aşağıda paylaşıyorum. KOdlar evrensel olarak İngilizce dilindedir. Bende ne yazık ki Türkçe kod yazılmaması gerektiğini düşünüyorum.

Geçelim Kodlarımıza

Tablolar arası ilişki için Model dosyaları aşağıdaki gibi;

App/Models/projects.php


namespace App\Models;

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

class Projects extends Model
{ 
use HasFactory; 
protected $guarded = []; 
protected $primarykey = "id"; 

public function sponsors() {

return $this->belongsTo(Sponsors::class, 'sponsor_id'); }

}

App/Models/sponsors.php



namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Model\Projects;
class Sponsors extends Model {

use HasFactory;

protected $guarded = [];

protected $primarykey = "id";

public function projects() {

return $this->hasMany(Projects::class);

}

}

Bu Model dosyaları ile tablolar arası ilişkiyi kurmuş olduk.

Sıra geldi Livewire'in sihirli dokunuşa.

!! Öncelikle projenizde Livewire kurulmuş, @livewirestyle ve @livewirescripts kodları view sayfanızda (ya da layout.app sayfanızda)eklenmiş olmalıdır. Livewire kurulumu konusunda livewire Quick Start tıklayarak ya da googleda arataark daha fazla bilgi alabilirsiniz.

Şimdi kurulumlar hazırsa Livewire Komponent eklyerek devam edelim.

Terminal kodu:


php artisan make:livewire projectSponsorDropdown

Bu komut bize view ve komponent dosyalarını otomatik olarak oluşturdu. oluşan dosyaların içi aşağıdaki gibi.

resources/views/livewire/project-sponsor-dropdown.blade.php


<div>
            <div class="form-group">
                <label for="sponsor_id">Sponsor Adı</label>
                <select name="sponsor_id" id="sponsor_id" wire:model="sponsor" class="form-control" >
                <option value=''>Seçiniz:</option>
                @foreach($sponsors as $sponsor)
                    <option value={{ $sponsor->id }}>{{ $sponsor->name }}</option>
                @endforeach
                </select>
            </div>

            @if(count($this->projects) > 0) 
                <div class="form-group">
                    <label for="project_id">Proje Adı</label>
                    <select name="project_id" id="project_id" wire:model="project" class="form-control {{ count($this->projects)==0 ? 'hidden' : '' }}" >
                    <option value=''>Seçiniz:</option>
                    @foreach($this->projects as $project)
                        <option value={{ $project->id }}>{{ $project->name }}</option>
                    @endforeach
                    </select>
                </div>
            @endif
</div>

Komponent içeriği,

App/Http/Livewire/ProjectSponsorDropdown.php


refreshData();
    }

    private function refreshData()
    {
        $this->sponsors = Sponsors::orderBy('name')->get();
        if (!empty($this->sponsor)) {
            $this->projects = Projects::where('sponsor_id', $this->sponsor)->get();
        }
    }

    public function render()
    {
        $this->refreshData();
        return view('livewire.project-sponsor-dropdown');           
}

Hepsi Bu kadar. Artık oluşturduğumuz livewire çoklu seçim dropdown ilişkisini istediğimiz form içerisinde aşağıdaki kodu kullanarak ekleyebiliriz.


@livewire('project-sponsor-dropdown')

Olası sorunlarınızı aşağıdaki yorum bölümüne yazabilirsiniz.

Yazar: Can BAYAT
Kimdir: 2015 yılından bu yana EMD Enerji Merkezi Danışmanlık şirketine bağlı olarak çalışmaktadır. 2016 SAÜ Fen Bilimleri Enstitüsü Jeofizik Mühendisliği Yüksek Lisans mezunudur. Evli ve bir çocuk babasıdır.
| | canbayat [at] gmail |