evet dersimizin 2bölümüne geçelim. şunu tekrar etmekte fayda görüyorum. benim de öyle ahım şahım bir bilgim yok. sadece videoda gördüğüm uyguladığım çeşitli fonksiyonları size gösteriyorum. işe yarıyor bunu geliştirmek 2 tablodan yüz tabloya çıkarmak sizin hayal gücünüzde.
iki tane tablo oluşturuyoruz. bunları migration ile yapıyoruz. bunun için aşağıdaki kodları kullanın ki modeli oluştururken tablo dosyasını da oluştursun.
1 |
php artisan make:model Category -a |
1 |
php artisan make:model Book -a |
bunu yaptığınızda hem model dosyamızı hem de migration klasörü altında 2019_01_02_074138_create_categories_table.php ve 2019_01_02_074147_create_books_table.php dosyamızı kendi oluşturuyor.
şimdi geliyoruz categories_table.php public up fonksiyonu içine
1 2 3 4 5 |
Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); |
books_table.php içine aşağıdaki kodları yazıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 |
Schema::create('books', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->string('author'); $table->string('image')->nullable(); $table->text('description')->nullable(); $table->string('link')->nullable(); $table->boolean('featured')->default(false); $table->unsignedInteger('category_id'); $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade'); $table->timestamps(); }); |
1 |
php artisan migrate |
php artisan migrate diyerek de bu tabloları veritabanımıza ekliyoruz. env dosyasında veritabanı ayarlarını yapmayı unutmayın.
neyse sonuç olarak book ve categori tablolarımızı oluşturduk. şimdi bunların model dosyalarına gelip ilişki kuruyoruz.
Category.php modelimize gelip;
1 2 3 4 |
public function books() { return $this->hasMany(Book::class); } |
fonksiyonu yazıyoruz. Book modelimize de gelip;
1 2 3 4 |
public function category() { return $this->belongsTo(Category::class); } |
bunu yazıyoruz. artık tablolarımızdaki ilişkilerimizi kurduk. buna seeder ile rastgele kayıtlar ekleyin 10-20 tane seeder ile yapabilirsiniz kolaydır daha önce anlatmıştık. burayı pas geçiyor ve hepsinde 20-30 veri olduğunu düşünüyorum. artık tablomuz da dolu. bunu da koyduk cebimize. şimdi graphql işlerimize geçelim.
routes/graphql/schema.graphql dosyasını açıp alt tarafa bu iki tablomuzu tanıtalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
type Book { id: ID! title: String! author: String! image: String link: String description: String featured: Boolean category: Category! @belongsTo } type Category { id: ID! name: String! books: [Book] @hasMany } |
yine aynı dosyada type Query { ile başlayan kısmın içine de aşağıdakileri yazıyoruz.
1 2 3 4 5 6 7 8 |
books: [Book] @all book(id: ID @eq): Book @find booksByFeatured(featured: Boolean! @eq): [Book] @all someComplexQuery(search: String!): [Book] categories: [Category] @all category(id: ID @eq): Category @find |
bakın şimdi demiş olduk ki query kardeşim sana book isimli bir query gelirse onun içinde de bir id değeri olacak git onu alt tarafta type book diye bir şey yazmıştım ya orada yer alan idye göre ara sonuç olarak bulunan değeri göster.
ilkinde ise books diye bir query gelirse ne kadar Book varsa getir. categories içinde gördüğünüz gibi benzer şeyleri yaptık. şimdi graphql sayfamızı açalım ve sorgularımızı yazalım.
1 2 3 4 5 6 |
query { books { id title } } |
sonuçlar gelmiş olmalı. bide find yapalım idye göre
1 2 3 4 5 6 |
query { book(id: 1) { id title } } |
kategoriyi de böyle yapabilirsiniz. şimdi orada iki method daha var. booksByFeatured ve someComplexQuery. bunları tanıtmak gerekirse ilki ile başlayayım. Featured öne çıkarılanlar anlamına gelmekte. Yani tanıtımlarda ilk sırada yer alacak kitaplar veritabanında Featured bölümünde Boolean olarak tanımlanmış yani 0-1 true false. Biz diyeceğiz ki abi sen bana featured değeri 1 olanları getir. nasıl mı yapacağız?
1 2 3 4 5 6 |
query { booksByFeatured(featured: true) { id title } } |
featured değeri true olanları getirdi. böylelikle farklı bir kolonda true false üzerinden işlem yapmayı da öğrendik. şimdi bize like da lazım. içinde a geçenler b geçenler. Bunu da someComplexQuery ile yapacağız. Bunu nasıl yapacağız peki?
someComplexQuery içine bakalım ilk önce search diye bir değişkene string bir veri istiyor karşılığında ise Book tablosunda ne varsa göster diyor. iyi hoş ama book tablosunda bir sürü kolon var hangisinde arama yapıyor?? onu da artisan komutları ile çözüceğiz. burada oluşturduğumuz metod adı ile query adımız aynı olmak zorunda.
1 |
php artisan lighthouse:query SomeComplexQuery |
Bu dosya app/Http/GraphQL/Queries/ içinde SomeComplexQuery.php olarak oluşuyor. bunun fonksiyon bölümüne sadece şu ufak kodu yazıyoruz.
1 2 3 4 5 |
public function resolve($rootValue, array $args, GraphQLContext $context = null, ResolveInfo $resolveInfo) { // Some complex query return \App\Book::where('author', 'like', '%'.$args['search'].'%')->get(); } |
$args olarak geliyor gönderdiğimiz veriler haberiniz olsun. Aslında böylelikle query oluşturmayı da öğrendik. tabi eminim daha güzel fonksiyonları da vardır ama bildiğim kadarıyla anlatıyorum.
ilişki kurmayı, arama yapmayı, query sorgu oluşturmayı öğrendik. ya dostum iyi hoş diyorsun ama ekleme silme işlemini nasıl yapacağız diyorsun. hemen ona geçelim
Bunun için Mutation adı verdikleri bir method var. bunun içine;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
type Mutation { createCategory( name: String @rules(apply: ["required", "unique:categories,name"]) ): Category @create updateCategory( id: ID @rules(apply: ["required"]) name: String @rules(apply: ["required", "unique:categories,name"]) ): Category @update deleteCategory( id: ID! @rules(apply: ["required"]) ): Category @delete createBook( title: String! @rules(apply: ["required"]) author: String! @rules(apply: ["required"]) image: String link: String description: String featured: Boolean category: Int! ): Book @create updateBook( id: ID @rules(apply: ["required"]) title: String! @rules(apply: ["required"]) author: String! @rules(apply: ["required"]) image: String link: String description: String featured: Boolean category: Int! ): Book @update deleteBook( id: ID! @rules(apply: ["required"]) ): Book @delete } |
rules yazanlar kontrol işlemi biliyorsunuz. gereklidir 10 kelime olsun yüz kelime olsun gibi validateleri içerir.
az çok okuyorsunuzdur ve ne anlama geldiklerini çözmüşünüzdür. ben bi kere de çalıştırayım gerisi size kalmış. yoruldum çünkü.
1 2 3 4 5 6 |
mutation { createCategory(name: "Kategori İsmi"){ id name } } |
id ve name değeri de eklediğimi görmek için. yani bunu ekledim idsi ve ismi bu diyor. basit gördüğünüz gibi. bu query içinde değil mutation içinde bu detaya dikkat tabi.
1 2 3 4 5 6 |
mutation { updateCategory(id:7,name: "Yeni Kategori İsmi"){ id name } } |
1 2 3 4 5 6 |
mutation { deleteCategory(id:7){ id name } } |
book kısmını da siz yapabilirsiniz. şimdi bunun videolu halini paylaşan kanalı ve dosyalarını aşağıdaki linklere tıklayarak öğrenebilirsiniz. Andre Madarang abimize kardeşimize bize bunu öğrettiği için teşekkür ederiz. kanal github