Laravel 8 Table Seeder içinde Faker Kullanımı

Örnek çalışma aşağıdadır.

<?php
use App\Models\Category;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Faker\Factory as Faker;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
 
     //   DB::table('categories')->truncate(); bunun yerine model kullanabiliriz
 
       Category::truncate();
       $faker = Faker::create();
        for($i=0; $i<30; $i++) {
           $category_name = rtrim($faker->sentence(1), '.');
            Category::create([
            'name' => $category_name,
            'slug' => Str::slug($category_name)
            ]);
        }
 
        //
    }
    }
}
?>

CategoriesTableSeeder isimli class yapısıyla beraber seed işlemi yapmak için örnek komut satırı:

 php artisan db:seed --class=CategoriesTableSeeder

DatabaseSeeder ile komut yazmak ve çalıştırmak (Laravel 8)

Laravel 8 ile DatabaseSeeder kullanabilmek için daha önce Factory oluşturmak gerekiyor bunu yaptığınızı varsayıyorum. (Laravel 8 Factory Oluşturmak)

Örnek Seeder yapısı

<?php
 
namespace Database\Seeders;
 
use App\Models\Product;
use App\Models\User;
use Illuminate\Database\Seeder;
 
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // \App\Models\User::factory(10)->create();
 
 
        User::factory()->count(100)->create();
        Product::factory()->count(100)->create();
 
    }
}

rastgele 100 kullanıcı oluşturmak ve veritabanına kaydetmek için:
factory(User::class, 100)->create();

rastgele 100 ürün oluşturmak ve kaydetmek için
Product::factory()->count(100)->create();

Çalıştırmak için terminalden:

php artisan db:seed

Laravel 8 Route::resource Controller Tanımlaması nasıl yapılır?

Sorunsuz bir şekilde OrnekController isimli bir controller oluşturduktan sonra route tanımlaması aşağıdaki gibi yapılması uygun olacaktır.

Route::resource('/products','App\Http\Controllers\OrnekController');

Eski sürümlerde yapılan tanımlama ise şöyleydi:

Route::resource('/products','OrnekController');

Bu şekilde yapacağınız tanımlar laravel 8 ve sonrasında sorun oluşturabilir.

Laravel 8 Tinker Terminal ile Product factory oluşturmak

Öncelikle Product isminde Model oluşturmanız gerekiyor isimler birebir aynı olursa hata almaycaksınız komut satırında vereceğim komutlar Laravel 8’e göredir.

ProductFactory adında factory oluşturmak için:

php artisan make:factory ProductFactory

Oluşan dosyanız database->factories içinde yer alan ProductFactory.php şeklinde olacaktır. Örnek içerik:

<?php
 
namespace Database\Factories;
 
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
 
class ProductFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array
     */
 
 
    public function definition()
    {
        $product_name = $this->faker->sentence(3);
 
        return [
            'name' => $product_name,
            'slug' => Str::slug($product_name),
            'description' => $this->faker->paragraph(5) ,
            'price' => mt_rand(10,100) / 10
        ];
    }
}

Okumaya devam et Laravel 8 Tinker Terminal ile Product factory oluşturmak

En Çok Kullanılan Laravel Mysql Terminal Komutları, Veritabanı işlemleri (Tinker)

Mysqle root ile bağlantı kurmak

mysql -u root

UTF8 formatında Veritabanı oluşturmak:

 CREATE DATABASE laravel_api CHARACTER SET utf8 COLLATE utf8_general_ci;

İşlem yapmak üzere İlgili veritabanını seçmek

USE DATABASEADI

Migrate dosyalarını çalıştırmak için

php artisan migrate

Yeni Migrate oluşturmak için

 php artisan make:migration create_products_table --create=products

Çalıştırılan Son Migrate işlemini geri almak için

php artisan migrate:ROLLBACK

Çalıştırılan TÜM Migrate işlemini geri almak için

php artisan migrate:reset

Hem reset Hem de migrate işlemini tek seferde yapmak için

php artisan migrate:refresh

Bütün tabloları silmek için

php artisan migrate:fresh

Migrate işleminde ilgili alanı Boş kalabilir yapmak için

$table->text('ornekalan')->NULLABLE();

Laravelde DB sınıfına ait hazır metodları kullanmak için

php artisan tinker

Tinker terminalden kayıt eklemek için

DB::INSERT('insert into tabloadi (sutun1, sutun2, sutun3) values (?, ?, ?), ['aciklama 1 ', 'aciklama 2', 'aciklama 3'] ');

Tinker terminalden kayıtları listelemek için

 DB::SELECT('select * from products');

Tablodaki verileri listelemenin diğer yolu:

DB::TABLE('urunler')->GET();

Tablodaki tek bir kaydı çekmek için

>>> DB::TABLE('urunler')->WHERE('kolonadi','icerik1')->GET()

Tablodaki verilerden tek bir şarta göre veri çekmek için
Örn: fiyatı 10 üzerinde olanları listelemek:

DB::TABLE('urunler')->WHERE('fiyat','>', 10)->GET()

Tablodaki verilerden tek bir şarta göre tek veri çekmek için
Örn: fiyatı 10 üzerinde olanlardan ilkini almak için

DB::TABLE('urunler')->WHERE('fiyat','>', 10)->FIRST()

Doğrudan ID’ye ait değere göre veri çekmek için:

DB::TABLE('urunler')->find(1);

Dizi halinde veri eklemek:

DB::TABLE('urunler')->INSERT(['name'=>'Product 10', 'slug'=> 'product-10', 'price'=>100])

Tablodaki kayıt sayısını bulmak

 DB::TABLE('urunler')->COUNT()

Her tabloya karşılık gelecek model oluşturmak:

php artisan make:model modelAdi

modelAdi İsimli Modeldeki Verileri Listelemek

 \App\Models\modelAdi::GET()

Laravel 8’de tinker kullanarak nesne oluşturmak:

$product = NEW \App\Models\Product;

Laravel 8 Tinker nesne içindeki verilerin veritabanına kaydedilmesi

 $product->save()

Tablodaki bütün kolonlara veri ekleme yapılabilmesine olacak sağlayan kod model içinde kullanımı

protected $guarded = [];

Tabloda seçili bir alanı güncellemek;

 App\Models\Urun::find(2)->UPDATE(['price' =>45.50]);

factory ile fake veriler oluşturmak

User::factory()->make();

Kullanım örneği:

use App\Models\User;

public function test_models_can_be_instantiated()
{
    $user = User::factory()->make();

    // Use model in tests...
}

Çoklu kullanım örneğin 3 adet kullanıcı oluşturmak için


User::factory()->count(3)->make();

Veritabanına eklemek için


User::factory()->count(3)->create();

Tabloyu boşlatmak için

DB::table('users')->truncate();

Factory Template Dosyası oluşturmak için

php artisan make:factory OrnekFactory

OrnekFactory içindeki ayarlamaları yaptıktan sonra tinker çalıştırmadan önce

composer dump-autoload

komutunu çalıştırmakta fadya var aksi halde hata alabilirsiniz.

seeders çalıştırmak

seed yapısı için run fonksiyonu içine
– 10 kullanıcı oluşturmak için
– bunu yapabilmek için daha önce UserFactory.php dosyasının olması ve gerekli düzenlemenin yapılmış olması gerekiyor.

 User::factory()->count(10)->create();

Terminalden bu komutu çalıştırmak için

php artisan db:seed

DatabaseSeeder.php içinden işlemler;

– Tabloyu boşaltmak için

DB::statement("Truncate table users");

Özel Seeder Yapısı oluşturmak:

 php artisan make:seeder OrnekTableSeeder

Harici seeder dosyalarını çağırmak:

Yukarıdaki gibi oluşturulan OrnekTableSeeder dosyasını DatabaseTableSeeder.php içine aşağıdaki gibi çağırarak kullanabiliriz:

 $this->call(OrnekTableSeeder::class);

Tabloların içini tamamen silmek:

php artisan migrate:fresh

Tüm tabloları silmek ve ardından seed işlemiyle otomatik doldurmak için

php artisan migrate:fresh --seed

Controller’dan uyeler.blade.php’ye veri göndermek için

$uyeler = Uyeler::find(3);
return view('uyeler', array('uyeler'=>$uyeler));

Şarta göre veri listelemek

$uyeler = Uyeler::where('id',4)->first();
return view('uyeler', array('uyeler'=>$uyeler));

WhereRaw fonksiyonu ile şarta göre veri listelemek

$uyeler = Uyeler::whereRaw('id=?', array(1))->first();
return view('uyeler', array('uyeler'=>$uyeler));

Birden fazla satır veri listelemek

$uyeler = Uyeler::all();

satır sayısını bulmak

$uyeSayisi = Uyeler::where('id', '>', 0)->count();

Yukarıda değişkene aktarılanları uyeler blade sayfasına postalamak için

return view('uyeler', array('uyeler'=>$uyeler, 'uyeSayisi' =>$uyeSayisi));

Route yapısı içinde factory kullanımı

Route::get('/users', function (){

    return User::factory()->count(10)->make();

});

Controller oluştururken Otomatik model ve metodları oluşturmak

php artisan make:controller ProductController --resource --model=Product

Route Tanımlarını Listelemek

 php artisan route:list

Api Klasörü içinde model tanımlı oluşturmak

php artisan make:controller Api\ProductController --api --model=
product

apiResources Toplu Tanımlama Örneği:

Route::apiResources([
    'products' => 'App\Http\Controllers\Api\ProductController',
    'users' => 'App\Http\Controllers\Api\UserController'

]);

Product isimli modeldeki dataların hepsini listelemek

  return Product::all();
 

Product isimli modeldeki dataların hepsini listelemek 2. yol

  return response()->json(Product::all(), 200);
 

ID’ye dayalı veri kontrolü yapmak (girilen id değerine karşılık veritabanında veri yoksa hata mesajı vermek)

    public function show($id)
    {
        $product = Product::find($id);
 
        if ($product)
            return response($product, 200);
        else
            return response(['message' => 'Product not found'], 404);
 
       // return $product;
 
    }

Laravel 8 PUT / update işlemi için aşağıdaki yöntemler kullanılabilir

    public function update(Request $request, product $product)
    {
        //

          $input = $request->all();
          $product->update($input);

        return response([
            'data' => $product,
            'message' => 'Product updated.'
             ], 200);

    }

yada

    public function update(Request $request, product $product)
    {
        //


        $product->name = $request->name;
        $product->slug = Str::slug($request->name);
        $product->price = $request->price;
        $product->save();

        return response([
            'data' => $product,
            'message' => 'Product updated.'
             ], 200);

    }

Laravel 8 DELETE / silme işlemi için aşağıdaki yöntemi kullanabilirsiniz.

public function destroy(product $product)
{
//

$product->delete();

return response([

‘message’ => ‘Product deleted’
], 200);

}

Laravel 8 Paginate sayfalama kullanımı

– her sayfada 5 adet gösterim için

  return response(Product::paginate(5),200);

Laravel 8 Paginate Offset ve limit kullanımı:
– varsayılan değerleri girerek sayfalama

        $offset = $request->offset ? $request->offset: 0;
        $limit = $request->limit ? $request->limit: 10;

        return response(Product::offset($offset)->limit($limit)->get(),200);

Get kullanımı örnek:
– 11’den itibaren 5 kayıt ekrana gelecektir

http://127.0.0.1:8000/api/products?offset=10&limit=5

Call to undefined function factory() in Psy Shell code ÇÖZÜMÜ

Laravel 8 sonrası factory kullanımıyla alakalı gelebilecek hatalardan birisi;

PHP Fatal error: Call to undefined function factory() in Psy Shell code on line 1

bu hatanın oluşmasına sebep olan komut satırı

factory(App\Models\User::class)->make();

ÇÖZÜM:
Laravel 8’de güncel olarak YUKARIDAKİ kod yerine aşağıdakini kullanarak sorunu çözebilirsiniz.

User::factory()->make();

Kullanım örneği:

use App\Models\User;

public function test_models_can_be_instantiated()
{
    $user = User::factory()->make();

    // Use model in tests...
}

Çoklu kullanım örneğin 3 adet oluşturmak için


User::factory()->count(3)->make();

Veritabanına eklemek için


User::factory()->count(3)->create();

Tinker Terminal üzerinden model kullanarak veri ekleme işlemi

Modele dizi halinde veri ekleme işlemi için

\App\Models\Product::create(['name'=>'Product 6', 'slug'=>'product-6', 'price'=>88 ])

kullanabilirsiniz.

Şöyle bir hata alıyorsanız;

Illuminate\Database\Eloquent\MassAssignmentException with message 'Add [name] to fillable property to allow mass assignment on [App\Models\Product].'

Product isimli model dosyasına eklenmesi gereken kod blogu;

 protected $fillable = ['name', 'slug', 'price'];

** 3 adet veri ekleme denemesi yaptığımız sütunların isimlerini örnekteki gibi yapmamız gerekiyor.

Eğer Tinker kullanarak ekleme işlemi yapmaya çalışıyorsanız hatanın düzelmesi için tinkerı kapatıp tekrar başlatmanız gerekecektir.

Laravel 8 Target class [xxxController] does not exist. HATA ÇÖZÜMÜ

hata kodu:

  * @throws \Illuminate\Contracts\Container\BindingResolutionException
 
     * @throws \Illuminate\Contracts\Container\CircularDependencyException
 
     */
 
    public function build($concrete)
 
    {
 
        // If the concrete type is actually a Closure, we will just execute it and
 
        // hand back the results of the functions, which allows functions to be
 
        // used as resolvers for more fine-tuned resolution of these objects.
 
        if ($concrete instanceof Closure) {
 
            return $concrete($this, $this->getLastParameterOverride());
 
        }
 
 
 
        try {
 
            $reflector = new ReflectionClass($concrete);
 
        } catch (ReflectionException $e) {
 
            throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
 
        }
 
 
 
        // If the type is not instantiable, the developer is attempting to resolve
 
        // an abstract type such as an Interface or Abstract Class and there is
 
        // no binding registered for the abstractions so we need to bail out.
 
        if (! $reflector->isInstantiable()) {
 
            return $this->notInstantiable($concrete);
 
        }
 
 
 
        // if (in_array($concrete, $this->buildStack)) {
 
        //     throw new CircularDependencyException("Circular dependency detected while resolving [{$concrete}].");
 
        // }
 
 
 
        $this->buildStack[] = $concrete;

web.php’de hata almama sebep olan route yapısı:

Route::get('/xxx/{id}/', 'xxxController@show');

Hatanın düzelmesi için eklenmesi gereken kod: App\Http\Controllers\

Düzeltmeden sonrası:

Route::get('/xxx/{id}/', 'App\Http\Controllers\xxxController@show');