Laravel Veritabanı İşlemleri

Laravel Veritabanı İşlemleri

Merhabalar bugün sizlere Laravel Framwork‘ü ile veritabanı işlemlerinin nasıl yapılacağını anlatacağım. Detaylı sorgular için Laravel tarafından oluşturulmuş Database: Query Builder inceleyebilirsiniz.


1. Adım Laravel Projesi Oluşturma

Komut yöneticisini açıyoruz.(CMD & Terminal) ardından bilgisayarınızda global olarak laravel yüklü ise

laravel new crudExample

kodunu kullanabilirsiniz. Fakat bilgisayarınızda sadece composer yüklü ise

composer create-project --prefer-dist laravel/laravel crudExample

komutunu kullanarak crudExample adında bir Laravel projesi oluşturabilirsiniz. Yükleme işlemleri tamamlandıktan sonra.


2. Adım Veritabanı Oluşturma İşlemleri

Ben bu aşamada MySQL kullanacağım. İlk olarak phpmyadmin üzerinde bir adet veritabanı oluşturalım. Ben isim olarak crudexample adını veriyorum fakat siz istediğiniz herhangi bir ismi verebilirsiniz.

Artık Laravel framworküne bağlayacağımız bir veritabanımız var. Şimdi projemizin ana dizininde bulunan .env dosyasını açalım ve gerekli düzenlemeleri yapalım.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=veritabanınızın adı (Örn: crudexample)
DB_USERNAME=veritabanınızın kullanıcı adı (Örn: root)
DB_PASSWORD=veritabanınızın şifresi (Örn: 123)

Laravel ile veritabanı bağlantımızı başarıyla yaptık.


3. Adım Tablo Oluşturma (Migration Oluşturma)

Artık veritabanı bağlantımızı da yaptığımıza göre tablolarımızı oluşturabiliriz. Laravel 7 ile birlikte komut satırına (CMD & Terminal ) komutlarımızı yazarak model oluşturabiliriz.

php artisan make:migration create_articles_table --create=articles

create_articles_table adında migration bilgilerimizin tutulacağı bir php dosyası oluşturacaktır.

–create=articles komutu ise bize hazır bir şablon vermektedir. Burada geçen articles ismi ise tablomuzun adını belitmektedir. create_articles_table dosyasına ulaşmak için “database/migrations” yolunu takip edebilirsiniz.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();            // UNIQ ID
            $table->string('title'); // Yazı başlığı.
            $table->text('article'); // Yazımız
            $table->timestamps();    // Oluşturma ve Düzenleme tarihleri
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

İçeriğinde başlık ve yazımızın bulunduğu bir tablonun temellerini hazırladık. Artık kodumuzu çalıştırarak tablomuzu veritabanına kayıt edebiliriz. Bu işlem için komut satırına (CMD & Terminal)

php artisan migrate

komutunu yazıp çalıştıralım. Veritabanımıza gidip baktığımızda 2 adet tablo oluştuğunu göreceksiniz.

migrations : Migrasyon verilerinin tutulduğu tablo.

articles : Bizim oluşturduğumuz. Yazılarımızın tutulacağı tablo.


4. Adım Route Oluşturma

Laravel’in genel veritabanı işlemlerinin yapıldığı hazır bir route inşa edebiliyor. Bunun için “route/web.php” dosyasının içerisine

Route::resource('articles','ArticleController');

Komutunu eklemeniz yeterlidir. Bu sayede oluşturacağımız Controller’ın routelarını tek bir komut ile tanımlamış olduk.


5. Adım Controller ve Model Oluşturma

Bu işlemi hızlıca yapabilmek için tekrar Komut satırını (CMD & Terminal) kullanacağız.

php artisan make:controller ArticleController --resource --model=Article

Bu komut ile bir AritcleController adında bir Controller ve Article adında bir Model oluşturuyoruz. Oluştururken bize model oluşturmak isteyip istemediğimiz hakkında soru soruyor bu soruya yes cevabını vererek Modelimizide oluşturmuş oluyoruz.

Peki bu –resource nedir ?

–resource komutu ile hazır kaynak kodlarımızı Controller’a dahil etmiş oluyoruz. Bu kaynak kodlarının içerisinde:

  • index() : Verilerimizin listeleneceği method
  • create(): Veri ekleme sayfamızın görüntüleneceği method
  • store(): Veri ekleme işlemimizin gerçekleşeceği method
  • show(): Tek bir verimizin detaylı listeleneceği method
  • edit(): Veri düzenleme sayfamızın görüntüleneceği method
  • update(): Veri güncelleme işleminin gerçekleşeceği method
  • destroy(): Veri silme işleminin gerçekleşeceği method

şeklinde bizlere hazır methodlar sağlamaktadır. Bu methodları Controllarınız üzerinden görmek isterseniz “app/http/Controllers/ArticleController.php” dosya yoluna gidip inceleyebilirsiniz.

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $articles = Article::get();
        return view("articles.list",['articles' => $articles]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view("articles.create");
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'title'     => 'required',
            'article'   => 'required',
        ]);

        Article::create($request->all());
        return redirect()->route('articles.index')
                        ->with('success','Kayıt başarıyla yapıldı.');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function show(Article $article)
    {
        return view("articles.show",['article'  => $article]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function edit(Article $article)
    {
        return view("articles.edit",['article'  => $article]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Article $article)
    {
        $request->validate([
            'title'     => 'required',
            'article'   => 'required',
        ]);

        $article->update($request->all());

        return redirect()->route('articles.index')
                        ->with('success','Kayıt başarıyla güncellendi.');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function destroy(Article $article)
    {
        $article->delete();
        return redirect()->route('articles.index')
                        ->with('success','Kayıt başarıyla silindi.');
    }
}

Evet gerekli veritabanı işlemlerini yapacak şekilde Controllerimizi düzenledik. Artık modelimizi düzenleyebiliriz.


6. Adım Model Düzenleme

“app/Article” model dosyamıza müdahale edeceğimiz verilerimizi tanımlıyoruz.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $fillable = [
        'title', 'article'
    ];
}

7. Adım Sayfaların Oluşturulması

“resources/view” klasörünün içerisine 2 adet klasör oluşturalım.

  1. Klasör: shared
  2. Klasör: articles

shared: Bu klasörün içerisinde tüm sayfalarda olmasını istediğimiz parçaları bulunduracağız. Bir sade bir işlem yaptığımız için içersinde sadece “layout.blade.php” oluşturacağız.

shared/layout.php

<!DOCTYPE html>
<html>
<head>
    <title>Laravel 7 Veritabanı İşlemleri</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
</head>
<body>

<div class="container mt-3">
    @yield('content')
</div>

<!-- Footer -->
<footer class="page-footer font-small blue fixed-bottom">

    <!-- Copyright -->
    <div class="footer-copyright text-center py-3">© 2020 Copyright:
      <a href="https://enginyenice.com/"> enginyenice.com</a>
    </div>
    <!-- Copyright -->

  </footer>
  <!-- Footer -->

</body>
</html>

2. Klasörümüz olan articles klasörünün içerisine

  • list.blade.php (Yazılarımızın listelendiği sayfa)
  • show.blade.php (Yazı detaylı gösterme sayfamız.)
  • create.blade.php (Yazı ekleme sayfamız)
  • edit.blade.php (Yazı düzenleme sayfamız)

articles/list.blade.php

@extends('shared.layout')

@section('content')
<div class="row">
    <div class="container">


        @if ($message = Session::get('success'))
        <div class="alert alert-success">
            <p>{{ $message }}</p>
        </div>
        @endif
        <a href="{{ route('articles.create')}}" class="btn btn-sm btn-success mt-2">Ekle</a>
        <table class="table table-bordered mt-2">
            <thead>
                <tr>
                    <th width="5%">ID</th>
                    <th width="15%">Başlık</th>
                    <th width="30%">Yazı</th>
                    <th width="20%">Göster</th>
                    <th width="20%">Düzenle</th>
                    <th width="10%">Sil</th>
                </tr>
            <thead>
            <tbody>
                @foreach ($articles as $article)
                <tr>
                    <td>{{ $article->id}}</td>
                    <td>{{ $article->title}}</td>
                    <td>{{ $article->article}}</td>
                    <td><a class="btn btn-sm btn-primary" href="{{ route('articles.show',$article->id) }}">Göster</a></td>
                    <td><a class="btn btn-sm btn-info" href="{{ route('articles.edit',$article->id) }}">Düzenle</a></td>
                    <td>
                    <form action="{{ route('articles.destroy', $article->id)}}" method="POST">
                            @csrf
                        @method('DELETE')
                        <button type="submit" class="btn btn-danger">Sil</button>
                        </form>
                    </td>
                </tr>
                @endforeach
            </tbody>


                <tfoot>
                    <tr>
                        <th width="5%">ID</th>
                        <th width="15%">Başlık</th>
                        <th width="30%">Yazı</th>
                        <th width="20%">Göster</th>
                        <th width="20%">Düzenle</th>
                        <th width="10%">Sil</th>
                    </tr>
                <tfoot>
        </table>
    </div>

</div>
@endsection

articles/show.blade.php sayfamız

@extends('shared.layout')

@section('content')
<div class="row">
    <div class="container">
    @if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif
    <form action="{{ route('articles.update',$article->id)}}" method="POST">
        @csrf
        @method('PUT')
        <div class="form-group row">
        <h1>Başlık: <strong>{{ $article->title }}</strong></h1>
        </div>

        <div class="form-group row">
            <p>Oluşturma Tarihi: <strong>{{ $article->created_at }}</strong></p>
        </div>

        <div class="form-group row">
            <p>Düzenlenme Tarihi: <strong>{{ $article->updated_at }}</strong></p>
        </div>

        <div class="form-group row">
            <p>Yazı: {{ $article->article }}</p>
        </div>
        <div class="form-group row">

        <a href="{{ route('articles.index') }}" class="btn btn-primary">Geri Git</a>
        </div>
    </form>
    </div>
</div>
@endsection

articles/create.blade.php

@extends('shared.layout')

@section('content')
<div class="row">
    <div class="container">
    @if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif
    <form action="{{ route('articles.store')}}" method="POST">
        @csrf
        <div class="form-group row">
            <label class="form-input col-sm-1 mt-1">Başlık</label>
            <input type="text" class="col-sm-11" name="title">
        </div>

        <div class="form-group row">
            <label class="form-input col-sm-1 mt-1">Yazı</label>
            <textarea name="article" class="col col-sm-11"></textarea>
        </div>
        <div class="form-group row">

            <button type="submit" class="btn btn-success d-inline-block col-sm-12">Ekle</button>
        </div>
    </form>
    <div class="form-group row text-center">
        <a href="{{ route('articles.index') }}" class="btn btn-secondary d-inline-block col-sm-12">Geri Git</a>
    </div>
    </div>
</div>
@endsection

articles/edit.blade.php

@extends('shared.layout')

@section('content')
<div class="row">
    <div class="container">
    @if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>

    @endif

    <form action="{{ route('articles.update',$article->id)}}" method="POST">
        @csrf
        @method('PUT')
        <div class="form-group row">
            <label class="form-input col-sm-1 mt-1">Başlık</label>
        <input type="text" class="col-sm-11" name="title" value="{{ $article->title }}">
        </div>

        <div class="form-group row">
            <label class="form-input col-sm-1 mt-1">Yazı</label>
            <textarea name="article" class="col col-sm-11">{{ $article->article }}</textarea>
        </div>
        <div class="form-group row">

            <button type="submit" class="btn btn-success d-inline-block col-sm-12">Güncelle</button>
        </div>
    </form>
    <div class="form-group row text-center">
        <a href="{{ route('articles.index') }}" class="btn btn-secondary d-inline-block col-sm-12">Geri Git</a>
    </div>
    </div>
</div>
@endsection

Artık oluşturduğumuz sayfaları ziyaret edebiliriz. Tarayıcımızda http://localhost:8000/articles adresini ziyaret ederek sayfalarımıza ulaşabiliriz.


Bloğumu halen incelemediniz mi ? https://enginyenice.com/

Hakkımda: https://enginyenice.com/hakkimda/

İletişim : https://enginyenice.com/iletisim/

Yayımlayan

2 Replies to “Laravel Veritabanı İşlemleri

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir