{"id":35411,"date":"2025-11-29T10:01:08","date_gmt":"2025-11-29T07:01:08","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/"},"modified":"2025-11-29T10:01:08","modified_gmt":"2025-11-29T07:01:08","slug":"mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/","title":{"rendered":"Mitsuki Repositories: Zero&#8217;dan Full CRUD&#8217;a Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.<\/p>\n<p>Modern yaz\u0131l\u0131m mimarilerinde veri y\u00f6netimi, uygulaman\u0131n en kritik bile\u015fenlerinden biridir. Veritaban\u0131 ile do\u011frudan etkile\u015fim kurmak, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde zamanla s\u00fcrd\u00fcr\u00fclemez bir hal alabilir. \u0130\u015fte tam bu noktada, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Repository_pattern\" target=\"_blank\">Repository Pattern (Depo Deseni)<\/a> devreye girer. Mitsuki Repositories, bu deseni uygulayan, veri eri\u015fim katman\u0131n\u0131z\u0131 soyutlayan ve i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 veritaban\u0131 detaylar\u0131ndan ay\u0131ran kurgusal bir k\u00fct\u00fcphanedir. Basit\u00e7e ifade etmek gerekirse, Mitsuki, uygulaman\u0131z\u0131n veritaban\u0131 ile nas\u0131l konu\u015ftu\u011funu standartla\u015ft\u0131ran, temiz ve d\u00fczenli bir aray\u00fcz sunar. Bu sayede, geli\u015ftiriciler veritaban\u0131 sorgular\u0131n\u0131n detaylar\u0131yla u\u011fra\u015fmak yerine, i\u015f kurallar\u0131na odaklanabilirler.<\/p>\n<p>Peki, Mitsuki Repositories&#8217;i kullanmak neden bu kadar \u00f6nemli? Temel faydalar\u0131 birka\u00e7 ana ba\u015fl\u0131k alt\u0131nda toplayabiliriz:<\/p>\n<ul>\n<li><strong>Soyutlama (Abstraction):<\/strong> Mitsuki, uygulaman\u0131z ile veritaban\u0131 aras\u0131nda bir soyutlama katman\u0131 olu\u015fturur. Bu, kulland\u0131\u011f\u0131n\u0131z veritaban\u0131 teknolojisini (SQL, NoSQL, in-memory) de\u011fi\u015ftirmek istedi\u011finizde, i\u015f mant\u0131\u011f\u0131n\u0131zda minimum de\u011fi\u015fiklik yapman\u0131z gerekti\u011fi anlam\u0131na gelir. Uygulaman\u0131z, veritaban\u0131n\u0131n MySQL mi, PostgreSQL mi yoksa MongoDB mi oldu\u011funu bilmek zorunda kalmaz. Sadece Mitsuki Repository&#8217;nin sundu\u011fu aray\u00fczle etkile\u015fime ge\u00e7er.<\/li>\n<li><strong>S\u00fcrd\u00fcr\u00fclebilirlik ve Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> T\u00fcm veri eri\u015fim mant\u0131\u011f\u0131 tek bir yerde topland\u0131\u011f\u0131 i\u00e7in kodunuz daha d\u00fczenli hale gelir. Bir hata ay\u0131klama veya yeni bir \u00f6zellik ekleme gerekti\u011finde, ilgili veri operasyonlar\u0131n\u0131 kolayca bulabilir ve g\u00fcncelleyebilirsiniz. Bu, uzun vadede projenin bak\u0131m maliyetlerini \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcr\u00fcr.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> Repository deseni, test yaz\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Veritaban\u0131na ba\u011f\u0131ml\u0131 olan i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 test etmek istedi\u011finizde, ger\u00e7ek veritaban\u0131 yerine Mitsuki Repository&#8217;nin &#8220;mock&#8221; (sahte) bir uygulamas\u0131n\u0131 kullanabilirsiniz. Bu, testlerin daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 ortadan kald\u0131rarak daha g\u00fcvenilir test sonu\u00e7lar\u0131 elde etmenize yard\u0131mc\u0131 olur.\n<div class=\"expert-tip\">Uzman \u0130pucu: Unit test yazarken repository&#8217;leri soyutlamak, testlerinizi %60 daha h\u0131zl\u0131 ve ba\u011f\u0131ms\u0131z hale getirebilir.<\/div>\n<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection):<\/strong> Mitsuki Repositories, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu prensiplerine uygun olarak tasarlanm\u0131\u015ft\u0131r. Bu, bir kontrolc\u00fcn\u00fcn veya bir servis katman\u0131n\u0131n do\u011frudan bir veritaban\u0131 ba\u011flant\u0131s\u0131 olu\u015fturmak yerine, ihtiyac\u0131 olan repository&#8217;i d\u0131\u015far\u0131dan almas\u0131n\u0131 sa\u011flar. Bu sayede, bile\u015fenleriniz daha az ba\u011f\u0131ml\u0131 ve daha esnek hale gelir.<\/li>\n<li><strong>Tutarl\u0131l\u0131k:<\/strong> Veri eri\u015fim desenleri ve isimlendirme kurallar\u0131 Mitsuki taraf\u0131ndan standartla\u015ft\u0131r\u0131ld\u0131\u011f\u0131 i\u00e7in, farkl\u0131 geli\u015ftiricilerin yazd\u0131\u011f\u0131 kodlar aras\u0131nda tutarl\u0131l\u0131k sa\u011flan\u0131r. Bu, ekip \u00e7al\u0131\u015fmas\u0131nda \u00f6nemli bir avantaj sunar.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, Mitsuki Repositories kullanmak, veri katman\u0131n\u0131z\u0131 modern, esnek ve \u00f6l\u00e7eklenebilir bir yap\u0131ya kavu\u015fturman\u0131n anahtar\u0131d\u0131r. Bu sayede uygulaman\u0131z, gelecekteki de\u011fi\u015fikliklere ve geni\u015flemelere kar\u015f\u0131 \u00e7ok daha diren\u00e7li hale gelir. Veritaban\u0131 etkile\u015fimlerinin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 bir kenara b\u0131rak\u0131p, uygulama i\u015f mant\u0131\u011f\u0131n\u0131za odaklanmak istiyorsan\u0131z, Mitsuki Repositories tam size g\u00f6re bir \u00e7\u00f6z\u00fcm sunar. Bir sonraki b\u00f6l\u00fcmde, bu g\u00fc\u00e7l\u00fc yap\u0131y\u0131 projenize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h2>Mitsuki ile Geli\u015ftirme Ortam\u0131 Nas\u0131l Kurulur ve \u0130lk Repository Ad\u0131mlar\u0131 Nelerdir?<\/h2>\n<p>Mitsuki Repositories ile \u00e7al\u0131\u015fmaya ba\u015flamak i\u00e7in \u00f6ncelikle basit bir geli\u015ftirme ortam\u0131 kurmam\u0131z gerekiyor. Bu b\u00f6l\u00fcmde, Node.js ve NPM (Node Package Manager) kullanarak bir proje olu\u015fturacak ve Mitsuki&#8217;nin temel yap\u0131land\u0131rmas\u0131n\u0131 yapaca\u011f\u0131z. Amac\u0131m\u0131z, s\u0131f\u0131rdan bir &#8220;G\u00f6rev Y\u00f6neticisi&#8221; uygulamas\u0131 i\u00e7in veri eri\u015fim katman\u0131n\u0131 olu\u015fturmak ve ilk repository&#8217;mizi hayata ge\u00e7irmektir.<\/p>\n<p><strong>1. Gerekli Ara\u00e7lar\u0131n Kurulumu:<\/strong><\/p>\n<p>\u00d6ncelikle bilgisayar\u0131n\u0131zda Node.js ve NPM&#8217;in kurulu oldu\u011fundan emin olun. E\u011fer kurulu de\u011filse, Node.js&#8217;in resmi web sitesinden indirebilirsiniz. Kurulum tamamland\u0131ktan sonra terminalinizde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak versiyonlar\u0131n\u0131 kontrol edebilirsiniz:<\/p>\n<pre><code>\nnode -v\nnpm -v\n<\/pre>\n<p><\/code><\/p>\n<p><strong>2. Proje Ba\u015flatma:<\/strong><\/p>\n<p>Yeni bir proje klas\u00f6r\u00fc olu\u015fturun ve terminalde bu klas\u00f6re gidin:<\/p>\n<pre><code>\nmkdir mitsuki-gorev-yoneticisi\ncd mitsuki-gorev-yoneticisi\nnpm init -y\n<\/pre>\n<p><\/code><\/p>\n<p><code>npm init -y<\/code> komutu, varsay\u0131lan ayarlarla bir <code>package.json<\/code> dosyas\u0131 olu\u015fturacakt\u0131r.<\/p>\n<p><strong>3. Mitsuki ve Yard\u0131mc\u0131 Paketlerin Kurulumu:<\/strong><\/p>\n<p>Mitsuki'yi ve bir veritaban\u0131 adapt\u00f6r\u00fcn\u00fc (bu \u00f6rnekte SQLite kullanaca\u011f\u0131z, ancak konsept di\u011fer veritabanlar\u0131 i\u00e7in de benzerdir) projemize ekleyelim:<\/p>\n<pre><code>\nnpm install mitsuki-repo sqlite3\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>mitsuki-repo<\/code>, bizim kurgusal Mitsuki Repository k\u00fct\u00fcphanemizdir ve <code>sqlite3<\/code> ise veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in bir adapt\u00f6rd\u00fcr.<\/p>\n<p><strong>4. Mitsuki Yap\u0131land\u0131rmas\u0131:<\/strong><\/p>\n<p>Proje k\u00f6k dizininde <code>config.js<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m. Bu dosya, Mitsuki'nin veritaban\u0131 ba\u011flant\u0131 ayarlar\u0131n\u0131 i\u00e7erecektir:<\/p>\n<pre><code>\n\/\/ config.js\nmodule.exports = {\n  database: {\n    client: 'sqlite3',\n    connection: {\n      filename: '.\/dev.sqlite3' \/\/ Veritaban\u0131 dosyas\u0131n\u0131n yolu\n    },\n    useNullAsDefault: true \/\/ SQLite i\u00e7in \u00f6nerilen ayar\n  }\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma, Mitsuki'ye SQLite veritaban\u0131 kullanaca\u011f\u0131n\u0131 ve veritaban\u0131 dosyas\u0131n\u0131n <code>dev.sqlite3<\/code> ad\u0131yla proje klas\u00f6r\u00fcnde bulunaca\u011f\u0131n\u0131 s\u00f6yler.<\/p>\n<p><strong>5. \u0130lk Model Tan\u0131m\u0131:<\/strong><\/p>\n<p>Mitsuki, veritaban\u0131 tablolar\u0131n\u0131z\u0131 temsil eden modellere ihtiya\u00e7 duyar. <code>models<\/code> ad\u0131nda bir klas\u00f6r olu\u015ftural\u0131m ve i\u00e7ine <code>Task.js<\/code> ad\u0131nda bir dosya ekleyelim:<\/p>\n<pre><code>\n\/\/ models\/Task.js\nconst { Model } = require('mitsuki-repo');\n\nclass Task extends Model {\n  static get tableName() {\n    return 'tasks'; \/\/ Bu modelin e\u015fle\u015fti\u011fi veritaban\u0131 tablosu\n  }\n\n  static get jsonSchema() {\n    return {\n      type: 'object',\n      required: ['title', 'status'],\n      properties: {\n        id: { type: 'integer' },\n        title: { type: 'string', minLength: 3, maxLength: 255 },\n        description: { type: 'string', maxLength: 1000 },\n        status: { type: 'string', enum: ['pending', 'completed'], default: 'pending' },\n        createdAt: { type: 'string', format: 'date-time' },\n        updatedAt: { type: 'string', format: 'date-time' }\n      }\n    };\n  }\n}\n\nmodule.exports = Task;\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, <code>Task<\/code> ad\u0131nda bir model tan\u0131mlar. <code>tableName<\/code> \u00f6zelli\u011fi, modelin hangi veritaban\u0131 tablosuyla e\u015fle\u015fti\u011fini belirtir. <code>jsonSchema<\/code> ise, bu model i\u00e7in temel veri do\u011frulama kurallar\u0131n\u0131 ve alan t\u00fcrlerini tan\u0131mlar. Bu \u015fema, verilerinizi veritaban\u0131na kaydetmeden \u00f6nce do\u011frulaman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<p><strong>Vaka Analizi 1: G\u00f6rev Y\u00f6neticisi i\u00e7in \u00c7ekirdek Yap\u0131<\/strong><\/p>\n<p>Yukar\u0131daki ad\u0131mlarla, basit bir g\u00f6rev y\u00f6neticisi uygulamas\u0131 i\u00e7in temel veri modelini ve Mitsuki yap\u0131land\u0131rmas\u0131n\u0131 tamamlad\u0131k. \u015eimdi, bu yap\u0131y\u0131 kullanarak g\u00f6revleri olu\u015fturmak, okumak, g\u00fcncellemek ve silmek i\u00e7in repository mant\u0131\u011f\u0131n\u0131 nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 bir sonraki b\u00f6l\u00fcmlerde detayland\u0131raca\u011f\u0131z. \u00d6rne\u011fin, <code>Task<\/code> modeli \u00fczerinden yeni g\u00f6revler ekleyebilecek, mevcut g\u00f6revleri listeleyebilecek veya durumlar\u0131n\u0131 g\u00fcncelleyebilece\u011fiz. Bu ba\u015flang\u0131\u00e7, t\u00fcm CRUD operasyonlar\u0131n\u0131n temelini olu\u015fturmaktad\u0131r ve uygulamam\u0131z\u0131n veri katman\u0131n\u0131 sa\u011flam bir \u015fekilde in\u015fa etmemizi sa\u011flayacakt\u0131r.<\/p>\n<p>\u015eimdiye kadar yapt\u0131\u011f\u0131m\u0131z kurulum ile, veritaban\u0131 ba\u011flant\u0131s\u0131 ve model tan\u0131mlamas\u0131 haz\u0131r hale geldi. Bu sayede, i\u015f mant\u0131\u011f\u0131m\u0131z\u0131 do\u011frudan veritaban\u0131 i\u015flemleriyle kar\u0131\u015ft\u0131rmadan, temiz bir aray\u00fcz \u00fczerinden veri manip\u00fclasyonu yapabilece\u011fiz.<\/p>\n<h2>Temel CRUD Operasyonlar\u0131: Mitsuki ile Veri Yaratma (Create) ve Okuma (Read) \u0130\u015flemleri Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Mitsuki Repositories'in en temel ve en s\u0131k kullan\u0131lan i\u015flevleri, veritaban\u0131na yeni kay\u0131tlar eklemek (Create) ve mevcut kay\u0131tlar\u0131 sorgulamak (Read) \u00fczerinedir. Bu b\u00f6l\u00fcmde, g\u00f6rev y\u00f6neticisi uygulamam\u0131z \u00fczerinden bu iki kritik operasyonu ad\u0131m ad\u0131m inceleyece\u011fiz. Her operasyon i\u00e7in kod \u00f6rnekleri ve ger\u00e7ek d\u00fcnya senaryolar\u0131 ile konuyu peki\u015ftirece\u011fiz.<\/p>\n<h3>Yeni Kay\u0131t Olu\u015fturma: <code>create<\/code> Metodu ile Veritaban\u0131na Ekleme<\/h3>\n<p>Yeni bir g\u00f6rev kayd\u0131 olu\u015fturmak, uygulaman\u0131z\u0131n en s\u0131k ger\u00e7ekle\u015ftirece\u011fi i\u015flemlerden biridir. Mitsuki, modeliniz \u00fczerinden <code>create<\/code> metodunu kullanarak bu i\u015flemi son derece basit ve g\u00fcvenli bir \u015fekilde yapman\u0131z\u0131 sa\u011flar. Veri olu\u015ftururken, daha \u00f6nce tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>jsonSchema<\/code> devreye girer ve verilerin do\u011frulu\u011funu otomatik olarak kontrol eder, b\u00f6ylece veritaban\u0131na hatal\u0131 veri giri\u015fini engelleriz.<\/p>\n<p>\u00d6ncelikle, Mitsuki'yi yap\u0131land\u0131rd\u0131\u011f\u0131m\u0131z ana betik dosyam\u0131za (\u00f6rne\u011fin, <code>app.js<\/code> veya <code>index.js<\/code>) modelimizi ve yap\u0131land\u0131rmam\u0131z\u0131 dahil etmemiz gerekiyor:<\/p>\n<pre><code>\n\/\/ index.js\nconst { knex } = require('mitsuki-repo');\nconst config = require('.\/config');\nconst Task = require('.\/models\/Task');\n\n\/\/ Mitsuki'yi veritaban\u0131 konfig\u00fcrasyonu ile ba\u015flat\nTask.knex(knex(config.database));\n\nasync function main() {\n  \/\/ Veritaban\u0131 tablosunu olu\u015ftur (e\u011fer yoksa)\n  \/\/ Bu, \u00fcretim ortam\u0131nda migration'lar ile yap\u0131l\u0131r. Geli\u015ftirme i\u00e7in basitle\u015ftirildi.\n  await knex(config.database).schema.createTableIfNotExists('tasks', table => {\n    table.increments('id').primary();\n    table.string('title').notNullable();\n    table.text('description');\n    table.string('status').defaultTo('pending').notNullable();\n    table.timestamps(true, true); \/\/ createdAt ve updatedAt\n  });\n\n  console.log('Veritaban\u0131 tablosu haz\u0131r.');\n\n  \/\/ Yeni bir g\u00f6rev olu\u015fturma \u00f6rne\u011fi\n  try {\n    const newTask = await Task.query().insert({\n      title: 'Mitsuki Rehberini Yaz',\n      description: 'Zero to Full CRUD teknik makalesini tamamla.',\n      status: 'pending'\n    });\n    console.log('Yeni g\u00f6rev ba\u015far\u0131yla eklendi:', newTask.toJSON());\n\n    const anotherTask = await Task.query().insert({\n      title: 'Al\u0131\u015fveri\u015f Yap',\n      description: 'S\u00fcpermarketten sebze ve meyve al.',\n      status: 'pending'\n    });\n    console.log('Di\u011fer g\u00f6rev ba\u015far\u0131yla eklendi:', anotherTask.toJSON());\n  } catch (error) {\n    console.error('G\u00f6rev eklerken hata olu\u015ftu:', error.message);\n  }\n}\n\nmain();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, <code>Task.query().insert()<\/code> metodu kullan\u0131larak veritaban\u0131na yeni bir g\u00f6rev kayd\u0131 eklenir. Mitsuki, bu i\u015flemi veritaban\u0131n\u0131n kendine \u00f6zg\u00fc SQL (veya NoSQL) sorgusuna \u00e7evirir. E\u011fer veritaban\u0131 \u015femas\u0131nda tan\u0131ml\u0131 olan <code>title<\/code> veya <code>status<\/code> gibi zorunlu alanlar eksik olursa, Mitsuki bir do\u011frulama hatas\u0131 f\u0131rlatacakt\u0131r. Bu, hatal\u0131 veri giri\u015flerini daha erken a\u015famada yakalamak i\u00e7in kritik bir \u00f6zelliktir.<\/p>\n<h3>Kay\u0131tlar\u0131 Okuma: <code>findById<\/code>, <code>findAll<\/code> ve Filtreleme Se\u00e7enekleri<\/h3>\n<p>Veritaban\u0131na eklenen kay\u0131tlar\u0131 okumak, bir uygulaman\u0131n temel i\u015flevidir. Mitsuki Repositories, farkl\u0131 senaryolara uygun \u00e7e\u015fitli okuma metodlar\u0131 sunar:<\/p>\n<ul>\n<li><strong>Tekil Kay\u0131t Okuma (<code>findById<\/code> veya <code>findOne<\/code>):<\/strong> Belirli bir ID'ye sahip kayd\u0131 veya belirli kriterlere uyan ilk kayd\u0131 getirmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong>\u00c7oklu Kay\u0131t Okuma (<code>findAll<\/code>, <code>where<\/code>):<\/strong> Belirli kriterlere uyan birden fazla kayd\u0131 veya t\u00fcm kay\u0131tlar\u0131 getirmek i\u00e7in kullan\u0131l\u0131r. Filtreleme, s\u0131ralama ve sayfalama gibi se\u00e7eneklerle zenginle\u015ftirilebilir.<\/li>\n<\/ul>\n<pre><code>\n\/\/ Devam eden index.js dosyas\u0131nda\nasync function readTasks() {\n  console.log('\\n--- G\u00f6revleri Okuma \u0130\u015flemleri ---');\n\n  \/\/ T\u00fcm g\u00f6revleri listeleme\n  const allTasks = await Task.query();\n  console.log('T\u00fcm g\u00f6revler:', allTasks.map(task => task.toJSON()));\n\n  \/\/ Belirli bir ID ile g\u00f6rev bulma\n  const taskIdToFind = allTasks[0] ? allTasks[0].id : 1;\n  if (taskIdToFind) {\n    const taskById = await Task.query().findById(taskIdToFind);\n    console.log(<code>ID ${taskIdToFind} ile bulunan g\u00f6rev:<\/code>, taskById ? taskById.toJSON() : 'Bulunamad\u0131.');\n  }\n\n  \/\/ Durumu 'pending' olan g\u00f6revleri filtreleme\n  const pendingTasks = await Task.query().where('status', 'pending').orderBy('createdAt', 'desc');\n  console.log('Bekleyen g\u00f6revler:', pendingTasks.map(task => task.toJSON()));\n\n  \/\/ Sayfalama (Pagination) \u00f6rne\u011fi: \u0130lk 10 g\u00f6revi getir\n  const paginatedTasks = await Task.query().page(0, 10).orderBy('title');\n  console.log('\u0130lk 10 g\u00f6rev (sayfal\u0131):', paginatedTasks.results.map(task => task.toJSON()), 'Toplam:', paginatedTasks.total);\n}\n\n\/\/ main fonksiyonunu g\u00fcncelle\nasync function main() {\n  \/\/ ... (yukar\u0131daki kurulum ve insert kodlar\u0131) ...\n  await readTasks();\n}\n\nmain();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekler, Mitsuki'nin esnek sorgu API'si ile nas\u0131l veri \u00e7ekebilece\u011finizi g\u00f6sterir. <code>where<\/code> metodu ile belirli ko\u015fullar tan\u0131mlayabilir, <code>orderBy<\/code> ile sonu\u00e7lar\u0131 s\u0131ralayabilir ve <code>page<\/code> metodu ile sayfalama (pagination) uygulayabilirsiniz. Bu \u00f6zellikler, b\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir.<\/p>\n<p><strong>Vaka Analizi 2: G\u00f6revleri Durumlar\u0131na G\u00f6re Filtreleyerek Bir UI'da Listeleme<\/strong><\/p>\n<p>Bir web uygulamas\u0131 geli\u015ftirdi\u011finizi d\u00fc\u015f\u00fcn\u00fcn. Kullan\u0131c\u0131lar g\u00f6revlerini \"Bekleyen\" veya \"Tamamlanm\u0131\u015f\" olarak filtreleyebilmelidir. Mitsuki Repositories ile bu i\u015flemi ger\u00e7ekle\u015ftirmek olduk\u00e7a basittir. Frontend taraf\u0131ndan g\u00f6nderilen bir filtre parametresini alarak, repository'nizin <code>where<\/code> metodunu kullan\u0131rs\u0131n\u0131z. \u00d6rne\u011fin:<\/p>\n<pre><code>\n\/\/ \u00d6rnek API endpoint (Node.js Express)\n\/\/ app.get('\/tasks', async (req, res) => {\n\/\/   const { status, page = 0, size = 10 } = req.query;\n\/\/   let query = Task.query();\n\n\/\/   if (status) {\n\/\/     query = query.where('status', status);\n\/\/   }\n\n\/\/   const tasks = await query.page(parseInt(page), parseInt(size));\n\/\/   res.json({\n\/\/     tasks: tasks.results.map(task => task.toJSON()),\n\/\/     total: tasks.total,\n\/\/     page: parseInt(page),\n\/\/     size: parseInt(size)\n\/\/   });\n\/\/ });\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, kullan\u0131c\u0131lar\u0131n aray\u00fczde yapt\u0131\u011f\u0131 se\u00e7imlere g\u00f6re veritaban\u0131ndan dinamik olarak veri \u00e7ekilmesini sa\u011flar. Mitsuki'nin sa\u011flad\u0131\u011f\u0131 temiz API, bu t\u00fcr dinamik sorgular\u0131 yazmay\u0131 olduk\u00e7a kolayla\u015ft\u0131r\u0131r ve kodunuzun okunakl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. B\u00f6ylece, kullan\u0131c\u0131ya h\u0131zl\u0131 ve etkili bir filtreleme deneyimi sunulabilir.<\/p>\n<h2>Veri G\u00fcncelleme (Update) ve Silme (Delete) Operasyonlar\u0131: Mitsuki ile Kay\u0131t Y\u00f6netimi Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>CRUD operasyonlar\u0131n\u0131n son iki aya\u011f\u0131 olan g\u00fcncelleme ve silme i\u015flemleri, veri ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn kritik par\u00e7alar\u0131d\u0131r. Mitsuki Repositories, bu operasyonlar\u0131 da g\u00fcvenli ve verimli bir \u015fekilde ger\u00e7ekle\u015ftirmenizi sa\u011flayan g\u00fc\u00e7l\u00fc metodlar sunar. Bu b\u00f6l\u00fcmde, mevcut g\u00f6rev kay\u0131tlar\u0131n\u0131 nas\u0131l g\u00fcncelleyece\u011fimizi ve ihtiyac\u0131m\u0131z kalmayan kay\u0131tlar\u0131 nas\u0131l silece\u011fimizi \u00f6rneklerle a\u00e7\u0131klayaca\u011f\u0131z.<\/p>\n<h3>Mevcut Kay\u0131tlar\u0131 G\u00fcncelleme: <code>update<\/code> Metodu ile Verileri De\u011fi\u015ftirme<\/h3>\n<p>Bir g\u00f6rev kayd\u0131n\u0131n ba\u015fl\u0131\u011f\u0131n\u0131, a\u00e7\u0131klamas\u0131n\u0131 veya durumunu de\u011fi\u015ftirmek gibi senaryolar, g\u00fcncelleme operasyonlar\u0131n\u0131 gerektirir. Mitsuki, modeliniz \u00fczerinde <code>update<\/code> metodunu kullanarak bu i\u015flemi olduk\u00e7a basitle\u015ftirir. G\u00fcncelleme yaparken, sadece de\u011fi\u015ftirmek istedi\u011finiz alanlar\u0131 belirtmeniz yeterlidir. Di\u011fer alanlar oldu\u011fu gibi kal\u0131r.<\/p>\n<pre><code>\n\/\/ Devam eden index.js dosyas\u0131nda\nasync function updateTasks() {\n  console.log('\\n--- G\u00f6revleri G\u00fcncelleme \u0130\u015flemleri ---');\n\n  \/\/ Bir g\u00f6revi bulup g\u00fcncelleme\n  const taskToUpdate = await Task.query().findOne({ title: 'Mitsuki Rehberini Yaz' });\n\n  if (taskToUpdate) {\n    const updatedTask = await taskToUpdate.$query().patch({\n      status: 'completed',\n      description: 'Mitsuki rehber makalesi ba\u015far\u0131yla tamamland\u0131.'\n    });\n    console.log('G\u00f6rev ba\u015far\u0131yla g\u00fcncellendi:', updatedTask.toJSON());\n  } else {\n    console.log('G\u00fcncellenecek g\u00f6rev bulunamad\u0131.');\n  }\n\n  \/\/ Birden fazla g\u00f6revi toplu olarak g\u00fcncelleme (\u00f6rne\u011fin, t\u00fcm bekleyen g\u00f6revleri iptal etme)\n  \/\/ Dikkat: Ger\u00e7ek senaryolarda bu t\u00fcr toplu g\u00fcncellemeleri dikkatli yapmal\u0131s\u0131n\u0131z.\n  \/\/ const bulkUpdateResult = await Task.query().where('status', 'pending').patch({ status: 'cancelled' });\n  \/\/ console.log(<code>${bulkUpdateResult} adet g\u00f6rev iptal edildi.<\/code>);\n}\n\n\/\/ main fonksiyonunu g\u00fcncelle\nasync function main() {\n  \/\/ ... (yukar\u0131daki kurulum, insert ve read kodlar\u0131) ...\n  await updateTasks();\n  \/\/ ... (deleteTasks fonksiyonunu \u00e7a\u011f\u0131raca\u011f\u0131z) ...\n}\n\nmain();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, \u00f6nce belirli bir ba\u015fl\u0131\u011fa sahip g\u00f6revi bulup, ard\u0131ndan bu g\u00f6revin <code>status<\/code> ve <code>description<\/code> alanlar\u0131n\u0131 g\u00fcncelliyoruz. Mitsuki'nin <code>patch<\/code> metodu, sadece verilen alanlar\u0131 g\u00fcnceller ve di\u011fer alanlar\u0131 etkilemez. Bu yakla\u015f\u0131m, k\u0131smi g\u00fcncellemeler i\u00e7in idealdir ve gereksiz veri transferini engeller. <\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: G\u00fcncelleme i\u015flemlerinde, de\u011fi\u015ftirilmesi gereken alanlar\u0131 a\u00e7\u0131k\u00e7a belirtmek (patch kullanarak) hem performans\u0131 art\u0131r\u0131r hem de veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korur.<\/div>\n<\/p>\n<h3>Kay\u0131tlar\u0131 Silme: <code>delete<\/code> ve Soft Delete Yakla\u015f\u0131mlar\u0131<\/h3>\n<p>Bir g\u00f6revin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn sonunda, o g\u00f6revi sistemden kald\u0131rmak gerekebilir. Mitsuki, kay\u0131tlar\u0131 kal\u0131c\u0131 olarak silmek i\u00e7in <code>delete<\/code> metodunu sunar. Ancak \u00e7o\u011fu i\u015f uygulamas\u0131nda, verilerin kal\u0131c\u0131 olarak silinmesi yerine \"ar\u015fivlenmesi\" veya \"mant\u0131ksal olarak silinmesi\" (soft delete) tercih edilir. Soft delete, verilerin hala veritaban\u0131nda durdu\u011fu ancak uygulaman\u0131n normal ak\u0131\u015f\u0131nda g\u00f6r\u00fcnmedi\u011fi anlam\u0131na gelir.<\/p>\n<pre><code>\n\/\/ Devam eden index.js dosyas\u0131nda\nasync function deleteTasks() {\n  console.log('\\n--- G\u00f6revleri Silme \u0130\u015flemleri ---');\n\n  \/\/ Belirli bir g\u00f6revi kal\u0131c\u0131 olarak silme (Hard Delete)\n  const taskToDelete = await Task.query().findOne({ title: 'Al\u0131\u015fveri\u015f Yap' });\n  if (taskToDelete) {\n    await taskToDelete.$query().delete();\n    console.log('G\u00f6rev ba\u015far\u0131yla silindi (Hard Delete).');\n  } else {\n    console.log('Silinecek g\u00f6rev bulunamad\u0131.');\n  }\n\n  \/\/ Soft Delete yakla\u015f\u0131m\u0131\n  \/\/ Task modelimize 'deletedAt' ad\u0131nda yeni bir alan ekledi\u011fimizi varsayal\u0131m\n  \/\/ config.js veya Task.js modelimizde bunu tan\u0131mlamam\u0131z gerekir.\n  \/\/ Ger\u00e7ek bir soft delete i\u00e7in Task modelinde 'deleted_at' s\u00fctunu olmal\u0131\n  \/\/ ve Mitsuki modelinizin bu alan\u0131 otomatik y\u00f6netmesi i\u00e7in bir mekanizma eklenmeli.\n  \/\/ Basit bir \u00f6rnek i\u00e7in, manuel olarak g\u00fcncelleyelim:\n  const taskToSoftDelete = await Task.query().findOne({ title: 'Mitsuki Rehberini Yaz' }); \/\/ Bu g\u00f6rev tamamland\u0131 olarak i\u015faretlenmi\u015fti.\n  if (taskToSoftDelete) {\n    await taskToSoftDelete.$query().patch({ deletedAt: new Date().toISOString() });\n    console.log('G\u00f6rev ba\u015far\u0131yla silindi (Soft Delete).');\n  } else {\n    console.log('Soft delete yap\u0131lacak g\u00f6rev bulunamad\u0131.');\n  }\n\n  \/\/ Soft delete edilmi\u015f g\u00f6revleri sorgulama (yaln\u0131zca aktif olanlar\u0131 getirme)\n  const activeTasks = await Task.query().whereNull('deletedAt');\n  console.log('Aktif g\u00f6revler:', activeTasks.map(task => task.toJSON()));\n}\n\n\/\/ main fonksiyonunu g\u00fcncelle\nasync function main() {\n  \/\/ ... (yukar\u0131daki kurulum, insert, read ve update kodlar\u0131) ...\n  await deleteTasks();\n  console.log('\\n--- T\u00fcm CRUD Operasyonlar\u0131 Tamamland\u0131 ---');\n}\n\nmain();\n<\/pre>\n<p><\/code><\/p>\n<p>Kal\u0131c\u0131 silme i\u015flemi i\u00e7in <code>delete()<\/code> metodunu kullan\u0131r\u0131z. Ancak soft delete i\u00e7in, modelimize <code>deletedAt<\/code> gibi bir zaman damgas\u0131 alan\u0131 ekleyerek, bir kayd\u0131 silmek yerine bu alan\u0131 doldururuz. Sorgulama yaparken ise, <code>deletedAt<\/code> alan\u0131 null olan kay\u0131tlar\u0131 filtreleyerek sadece aktif olanlar\u0131 getiririz. Bu yakla\u015f\u0131m, silinen verilere daha sonra ihtiya\u00e7 duyuldu\u011funda geri d\u00f6n\u00fc\u015f imkan\u0131 sunar ve denetlenebilirlik a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/p>\n<p><strong>Vaka Analizi 3: Kullan\u0131c\u0131n\u0131n G\u00f6revlerini Silme veya Ar\u015fivleme Se\u00e7enekleri Sunan Bir Aray\u00fcz<\/strong><\/p>\n<p>Bir web uygulamas\u0131nda, kullan\u0131c\u0131lar tamamlanm\u0131\u015f g\u00f6revleri \"Sil\" veya \"Ar\u015fivle\" butonuyla y\u00f6netmek isteyebilir. \"Sil\" butonu, asl\u0131nda bir soft delete i\u015flemi ba\u015flatarak g\u00f6revin <code>deletedAt<\/code> alan\u0131n\u0131 doldurur. \"Ar\u015fivle\" butonu ise, g\u00f6revin durumunu \"archived\" gibi farkl\u0131 bir stat\u00fcye ge\u00e7irir. Bu, kullan\u0131c\u0131n\u0131n verilerini yanl\u0131\u015fl\u0131kla silmesini \u00f6nlerken, y\u00f6neticilerin denetim kay\u0131tlar\u0131na eri\u015fmesine veya kullan\u0131c\u0131lar\u0131n kendi ar\u015fivlenmi\u015f \u00f6\u011felerini g\u00f6rmesine olanak tan\u0131r. Mitsuki Repositories, bu t\u00fcr i\u015f mant\u0131\u011f\u0131n\u0131 veri eri\u015fim katman\u0131ndan soyutlayarak, uygulaman\u0131z\u0131n daha g\u00fcvenli ve esnek olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6zetle, Mitsuki Repositories, hem basit hem de karma\u015f\u0131k veri manip\u00fclasyonu ihtiya\u00e7lar\u0131n\u0131z i\u00e7in kapsaml\u0131 ve g\u00fcvenilir bir \u00e7\u00f6z\u00fcm sunar. Bu temel CRUD operasyonlar\u0131n\u0131 anlamak, Mitsuki ile g\u00fc\u00e7l\u00fc ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirmenin ilk ad\u0131m\u0131d\u0131r.<\/p>\n<h2>Mitsuki Repositories ile \u0130leri Seviye Yakla\u015f\u0131mlar: Performans, G\u00fcvenlik ve Mimari Optimizasyonlar\u0131<\/h2>\n<p>Mitsuki Repositories'in temel CRUD yeteneklerinin \u00f6tesine ge\u00e7erek, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak, g\u00fcvenli\u011fini sa\u011flamak ve mimarisini optimize etmek i\u00e7in kullanabilece\u011finiz ileri seviye yakla\u015f\u0131mlar mevcuttur. Bu b\u00f6l\u00fcmde, verimli sorgulama teknikleri, i\u015flem y\u00f6netimi, hata i\u015fleme ve g\u00fcvenlik ipu\u00e7lar\u0131 \u00fczerinde duraca\u011f\u0131z.<\/p>\n<h3>\u0130li\u015fkisel Veriler ve Eager\/Lazy Loading<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, veritaban\u0131 tablolar\u0131 genellikle birbiriyle ili\u015fkilidir (\u00f6rne\u011fin, bir g\u00f6rev bir\u00e7ok kullan\u0131c\u0131ya atanabilir veya bir g\u00f6rev bir\u00e7ok etikete sahip olabilir). Mitsuki, bu ili\u015fkileri y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc mekanizmalar sunar. \u0130li\u015fkisel verileri sorgularken, performans a\u00e7\u0131s\u0131ndan <strong>Eager Loading (Hevesli Y\u00fckleme)<\/strong> ve <strong>Lazy Loading (Tembel Y\u00fckleme)<\/strong> kavramlar\u0131 devreye girer.<\/p>\n<ul>\n<li><strong>Lazy Loading:<\/strong> Varsay\u0131lan olarak, bir model sorguland\u0131\u011f\u0131nda yaln\u0131zca o modele ait veriler getirilir. \u0130li\u015fkili veriler, onlara ihtiya\u00e7 duyuldu\u011funda ayr\u0131 bir sorgu ile y\u00fcklenir. Bu, \"N+1 sorgu problemi\"ne yol a\u00e7abilir; yani, N adet ana kay\u0131t i\u00e7in N adet ek sorgu anlam\u0131na gelir.<\/li>\n<li><strong>Eager Loading:<\/strong> \u0130li\u015fkili verilerin, ana sorgu ile birlikte tek seferde getirilmesidir. Bu, \u00f6zellikle birden fazla ili\u015fkili veriye ihtiya\u00e7 duydu\u011funuz durumlarda sorgu say\u0131s\u0131n\u0131 azaltarak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Mitsuki'de <code>withGraphFetched<\/code> veya <code>withGraphJoined<\/code> gibi metodlar bu ama\u00e7la kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<pre><code>\n\/\/ models\/User.js - \u00d6rnek bir kullan\u0131c\u0131 modeli\nconst { Model } = require('mitsuki-repo');\nclass User extends Model {\n  static get tableName() { return 'users'; }\n  static get relationMappings() {\n    return {\n      tasks: {\n        relation: Model.HasManyRelation,\n        modelClass: require('.\/Task'),\n        join: {\n          from: 'users.id',\n          to: 'tasks.userId' \/\/ Bir kullan\u0131c\u0131n\u0131n birden \u00e7ok g\u00f6revi olabilir\n        }\n      }\n    };\n  }\n}\nmodule.exports = User;\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n\/\/ Bir kullan\u0131c\u0131n\u0131n t\u00fcm g\u00f6revlerini eager loading ile getirme\nconst userWithTasks = await User.query().withGraphFetched('tasks').findById(1);\nconsole.log('Kullan\u0131c\u0131 ve g\u00f6revleri:', userWithTasks.toJSON());\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, bir kullan\u0131c\u0131y\u0131 ve ona ait t\u00fcm g\u00f6revleri tek bir sorguda nas\u0131l getirebilece\u011fimizi g\u00f6sterir. Bu, \u00f6zellikle bir sayfa y\u00fcklemesinde birden fazla ili\u015fkili veri k\u00fcmesini g\u00f6r\u00fcnt\u00fclemeniz gerekti\u011finde performans\u0131 dramatik bir \u015fekilde art\u0131r\u0131r.<\/p>\n<h3>\u0130\u015flem Y\u00f6netimi (Transactions) ve Hata Yakalama<\/h3>\n<p>Veritaban\u0131 i\u015flemleri, birden fazla ad\u0131m\u0131 i\u00e7eren ve t\u00fcm ad\u0131mlar\u0131n ba\u015far\u0131l\u0131 olmas\u0131 veya hi\u00e7birinin olmamas\u0131 gereken durumlar i\u00e7in \u00f6nemlidir. \u00d6rne\u011fin, bir g\u00f6revi bir kullan\u0131c\u0131ya atarken, g\u00f6revin durumunu g\u00fcncellemek ve kullan\u0131c\u0131n\u0131n bildirim listesine bir kay\u0131t eklemek gibi. Bu t\u00fcr durumlarda <strong>veritaban\u0131 i\u015flemleri (transactions)<\/strong> kullan\u0131l\u0131r.<\/p>\n<pre><code>\n\/\/ Bir i\u015flem i\u00e7inde birden fazla operasyon\nconst { knex } = require('mitsuki-repo'); \/\/ knex instance'\u0131 config.js'den geliyor\n\nasync function assignTaskTransaction(taskId, userId) {\n  const transaction = await Task.startTransaction(); \/\/ \u0130\u015flemi ba\u015flat\n  try {\n    \/\/ G\u00f6revi g\u00fcncelle\n    await Task.query(transaction).findById(taskId).patch({ userId: userId, status: 'assigned' });\n    \/\/ Kullan\u0131c\u0131ya bildirim ekle (varsay\u0131msal Notification modeli)\n    \/\/ await Notification.query(transaction).insert({ userId: userId, message: <code>Yeni g\u00f6rev atand\u0131: ${taskId}<\/code> });\n\n    await transaction.commit(); \/\/ T\u00fcm i\u015flemler ba\u015far\u0131l\u0131ysa kaydet\n    console.log('G\u00f6rev atama i\u015flemi ba\u015far\u0131l\u0131.');\n  } catch (error) {\n    await transaction.rollback(); \/\/ Herhangi bir hata durumunda t\u00fcm de\u011fi\u015fiklikleri geri al\n    console.error('G\u00f6rev atama i\u015flemi ba\u015far\u0131s\u0131z, geri al\u0131nd\u0131:', error.message);\n  }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\n\/\/ assignTaskTransaction(1, 2); \/\/ G\u00f6rev ID 1'i Kullan\u0131c\u0131 ID 2'ye ata\n<\/pre>\n<p><\/code><\/p>\n<p><code>startTransaction()<\/code>, <code>commit()<\/code> ve <code>rollback()<\/code> metodlar\u0131, i\u015flemlerinizi g\u00fcvenli bir \u015fekilde y\u00f6netmenizi sa\u011flar. Herhangi bir ad\u0131mda bir hata olu\u015fursa, <code>rollback()<\/code> ile t\u00fcm i\u015flemler geri al\u0131n\u0131r ve veritaban\u0131 tutarl\u0131 bir durumda kal\u0131r.<\/p>\n<h3>G\u00fcvenlik \u0130pu\u00e7lar\u0131 ve Do\u011frulama Mekanizmalar\u0131<\/h3>\n<p>Veritaban\u0131 g\u00fcvenli\u011fi, her uygulaman\u0131n olmazsa olmaz\u0131d\u0131r. Mitsuki Repositories, SQL enjeksiyonu gibi yayg\u0131n g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 yerle\u015fik korumalar sunsa da, ek \u00f6nlemler almak \u00f6nemlidir:<\/p>\n<ul>\n<li><strong>Girdi Do\u011frulama (Input Validation):<\/strong> Mitsuki'nin <code>jsonSchema<\/code> \u00f6zelli\u011fi, modelinize gelen verilerin tipini ve format\u0131n\u0131 do\u011frulamak i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Ancak, karma\u015f\u0131k i\u015f kurallar\u0131n\u0131z\u0131 ve kullan\u0131c\u0131 taraf\u0131ndan g\u00f6nderilen t\u00fcm verileri ek g\u00fcvenlik katmanlar\u0131yla (\u00f6rne\u011fin, Joi veya Yup gibi do\u011frulama k\u00fct\u00fcphaneleriyle) sunucu taraf\u0131nda do\u011frulamak hayati \u00f6neme sahiptir.<\/li>\n<li><strong>Yetkilendirme (Authorization):<\/strong> Kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa (\u00f6rne\u011fin, bir g\u00f6rev kayd\u0131na) eri\u015fme veya onu de\u011fi\u015ftirme yetkisinin olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek, repository katman\u0131ndan \u00f6nce veya repository metodlar\u0131 i\u00e7inde yap\u0131lmal\u0131d\u0131r. Mitsuki'nin kendisi yetkilendirme sa\u011flamaz, ancak repository metodlar\u0131n\u0131za yetkilendirme kontrollerini entegre edebilirsiniz.<\/li>\n<li><strong>Parameterized Queries:<\/strong> Mitsuki, kulland\u0131\u011f\u0131 ORM\/query builder sayesinde sorgular\u0131 otomatik olarak parametrele\u015ftirir. Bu, kullan\u0131c\u0131 girdilerinin do\u011frudan SQL sorgular\u0131na g\u00f6m\u00fclmesini engelleyerek SQL enjeksiyonu sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar.<\/li>\n<\/ul>\n<h3>Mobil Uyumluluk ve Duyarl\u0131 Tasar\u0131m i\u00e7in \u0130pu\u00e7lar\u0131<\/h3>\n<p>Mitsuki Repositories, backend'de veri eri\u015fimini y\u00f6netti\u011fi i\u00e7in do\u011frudan mobil uyumlulukla ilgili de\u011fildir. Ancak, repository'den gelen verilerin mobil cihazlarda nas\u0131l sunuldu\u011fu, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<p>Repository'den gelen veriler genellikle JSON format\u0131nda bir API arac\u0131l\u0131\u011f\u0131yla frontend'e (web veya mobil uygulama) ula\u015ft\u0131r\u0131l\u0131r. Frontend'in g\u00f6revi, bu veriyi farkl\u0131 ekran boyutlar\u0131na ve cihaz t\u00fcrlerine uygun \u015fekilde g\u00f6r\u00fcnt\u00fclemektir. Duyarl\u0131 tasar\u0131m (Responsive Design) ilkeleri burada devreye girer. HTML, CSS ve JavaScript kullanarak, uygulaman\u0131z\u0131n farkl\u0131 cihazlarda ayn\u0131 i\u00e7eri\u011fi optimum \u015fekilde sunmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<pre><code class=\"language-html\">\n<!-- index.html i\u00e7erisinde \u00f6rnek duyarl\u0131 tablo yap\u0131s\u0131 -->\n<style>\n  \/* Tablo genel stil *\/\n  table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n  }\n  th, td {\n    border: 1px solid #ddd;\n    padding: 8px;\n    text-align: left;\n  }\n  th {\n    background-color: #f2f2f2;\n  }\n\n  \/* Mobil uyumluluk i\u00e7in medya sorgusu *\/\n  @media screen and (max-width: 600px) {\n    table, thead, tbody, th, td, tr {\n      display: block; \/* Her h\u00fccreyi blok eleman yap *\/\n    }\n    thead tr {\n      position: absolute; \/* Ba\u015fl\u0131k sat\u0131r\u0131n\u0131 gizle ama eri\u015filebilir tut *\/\n      top: -9999px;\n      left: -9999px;\n    }\n    tr {\n      border: 1px solid #ccc;\n      margin-bottom: 10px;\n    }\n    td {\n      border: none; \/* Mobil g\u00f6r\u00fcn\u00fcmde h\u00fccre kenarl\u0131klar\u0131n\u0131 kald\u0131r *\/\n      border-bottom: 1px solid #eee;\n      position: relative;\n      padding-left: 50%; \/* \u0130\u00e7eri\u011fi sa\u011fa kayd\u0131r *\/\n      text-align: right;\n    }\n    td::before {\n      \/* Ba\u015fl\u0131klar\u0131 mobil g\u00f6r\u00fcn\u00fcmde g\u00f6ster *\/\n      position: absolute;\n      left: 6px;\n      width: 45%;\n      padding-right: 10px;\n      white-space: nowrap;\n      text-align: left;\n      font-weight: bold;\n    }\n    \/* Her s\u00fctun i\u00e7in \u00f6zel ba\u015fl\u0131k *\/\n    td:nth-of-type(1)::before { content: \"ID:\"; }\n    td:nth-of-type(2)::before { content: \"Ba\u015fl\u0131k:\"; }\n    td:nth-of-type(3)::before { content: \"A\u00e7\u0131klama:\"; }\n    td:nth-of-type(4)::before { content: \"Durum:\"; }\n  }\n<\/style>\n\n<table>\n  <thead>\n    <tr>\n      <th>ID<\/th>\n      <th>Ba\u015fl\u0131k<\/th>\n      <th>A\u00e7\u0131klama<\/th>\n      <th>Durum<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody id=\"task-list\">\n    <!-- G\u00f6revler buraya JavaScript ile y\u00fcklenecek -->\n  <\/tbody>\n<\/table>\n\n<script>\n  \/\/ Varsay\u0131msal API \u00e7a\u011fr\u0131s\u0131 ve tabloya veri y\u00fckleme\n  async function loadTasks() {\n    \/\/ const response = await fetch('\/api\/tasks'); \/\/ Backend Mitsuki Repository'den gelen veri\n    \/\/ const data = await response.json();\n    const tasks = [ \/\/ \u00d6rnek veri\n      { id: 1, title: 'Mitsuki Rehberini Yaz', description: 'Makale tamamland\u0131.', status: 'completed' },\n      { id: 2, title: 'Toplant\u0131ya Kat\u0131l', description: 'Ekip toplant\u0131s\u0131.', status: 'pending' }\n    ];\n\n    const taskList = document.getElementById('task-list');\n    taskList.innerHTML = '';\n    tasks.forEach(task => {\n      const row = <code><tr>\n          <td>${task.id}<\/td>\n          <td>${task.title}<\/td>\n          <td>${task.description}<\/td>\n          <td>${task.status}<\/td>\n        <\/tr><\/code>;\n      taskList.innerHTML += row;\n    });\n  }\n  loadTasks();\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Vaka Analizi 4: G\u00f6rev Listesinin Mobil ve Masa\u00fcst\u00fc Aray\u00fczlerinde Farkl\u0131 \u015eekilde G\u00f6sterilmesi<\/strong><\/p>\n<p>Yukar\u0131daki HTML ve CSS \u00f6rne\u011finde, bir g\u00f6rev listesi tablosu tan\u0131mlanm\u0131\u015ft\u0131r. Masa\u00fcst\u00fc g\u00f6r\u00fcn\u00fcm\u00fcnde klasik bir tablo olarak g\u00f6sterilirken, ekran geni\u015fli\u011fi 600 pikselin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde (mobil cihazlar i\u00e7in tipik bir e\u015fik), tablo h\u00fccreleri blok elemanlara d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve her bir h\u00fccrenin solunda ilgili ba\u015fl\u0131k g\u00f6r\u00fcn\u00fcr. Bu sayede, geni\u015f tablo verileri bile k\u00fc\u00e7\u00fck ekranlarda okunabilirli\u011fini korur. Mitsuki Repositories, bu verileri tutarl\u0131 ve g\u00fcvenilir bir \u015fekilde sa\u011flad\u0131\u011f\u0131 s\u00fcrece, frontend katman\u0131 bu verileri al\u0131p, farkl\u0131 kullan\u0131c\u0131 deneyimlerine g\u00f6re esnek bir \u015fekilde sunabilir.<\/p>\n<p>Bu ileri seviye yakla\u015f\u0131mlar, Mitsuki Repositories ile \u00e7al\u0131\u015f\u0131rken uygulaman\u0131z\u0131n daha sa\u011flam, g\u00fcvenli ve performansl\u0131 olmas\u0131n\u0131 sa\u011flar. Do\u011fru stratejilerle, veri katman\u0131n\u0131z\u0131 bir avantaj haline getirebilirsiniz.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Bu rehber boyunca, Mitsuki Repositories'in ne oldu\u011fundan, temel CRUD operasyonlar\u0131n\u0131 nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizden ve ileri seviye kullan\u0131m ipu\u00e7lar\u0131ndan bahsettik. Veri y\u00f6netiminin karma\u015f\u0131k d\u00fcnyas\u0131nda, Mitsuki gibi bir repository katman\u0131 kullanmak, geli\u015ftirme s\u00fcrecinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir, kodunuzu daha d\u00fczenli hale getirir ve uzun vadede projenizin s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, veri eri\u015fim katman\u0131n\u0131 soyutlamak, uygulaman\u0131z\u0131n veritaban\u0131 teknolojisinden ba\u011f\u0131ms\u0131z olmas\u0131n\u0131 sa\u011flar, test edilebilirli\u011fini art\u0131r\u0131r ve ekip i\u00e7inde tutarl\u0131 bir geli\u015ftirme prati\u011fi olu\u015fturur.<\/p>\n<p>Mitsuki Repositories, s\u0131f\u0131rdan ba\u015flayan bir geli\u015ftiricinin bile kolayca adapte olabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de derinlemesine optimizasyon ve esneklik sunan bir yakla\u015f\u0131md\u0131r. Veri olu\u015fturma, okuma, g\u00fcncelleme ve silme i\u015flemlerini g\u00fcvenle ger\u00e7ekle\u015ftirirken, performans art\u0131rma, i\u015flem y\u00f6netimi ve g\u00fcvenlik konular\u0131nda da \u00f6nemli avantajlar elde edersiniz. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 modern standartlara uygun hale getirmek istiyorsan\u0131z, Mitsuki Repositories'i tercih etmek, projenize de\u011fer katacakt\u0131r.<\/p>\n<p>Umar\u0131z bu kapsaml\u0131 rehber, Mitsuki Repositories'e olan yolculu\u011funuzda size yol g\u00f6sterici olmu\u015ftur. \u015eimdi, konuya dair s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan baz\u0131 sorular\u0131 yan\u0131tlayal\u0131m:<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Soru<\/th>\n<th>Cevap<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Mitsuki hangi veritaban\u0131 sistemlerini destekler?<\/strong><\/td>\n<td>Mitsuki Repositories, mimari olarak soyut bir katman oldu\u011fu i\u00e7in, arkas\u0131ndaki veritaban\u0131 adapt\u00f6r\u00fcne ba\u011fl\u0131 olarak \u00e7e\u015fitli veritabanlar\u0131n\u0131 destekleyebilir. Bu rehberde SQLite kulland\u0131k, ancak PostgreSQL, MySQL, MSSQL gibi ili\u015fkisel veritabanlar\u0131n\u0131n yan\u0131 s\u0131ra, uygun adapt\u00f6rlerle MongoDB veya Cassandra gibi NoSQL veritabanlar\u0131n\u0131 da destekleyebilir. Temel prensip, Mitsuki'nin kulland\u0131\u011f\u0131 ORM\/query builder'\u0131n destekledi\u011fi her veritaban\u0131 ile uyumlu \u00e7al\u0131\u015fabilmesidir.<\/td>\n<\/tr>\n<tr>\n<td><strong>Mitsuki repository kullanmak projenin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r m\u0131?<\/strong><\/td>\n<td>Ba\u015flang\u0131\u00e7ta ek bir soyutlama katman\u0131 getirdi\u011fi i\u00e7in k\u00fc\u00e7\u00fck bir \u00f6\u011frenme e\u011frisi olabilir. Ancak uzun vadede, kodun d\u00fczenli, mod\u00fcler ve test edilebilir olmas\u0131n\u0131 sa\u011flayarak karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r. Do\u011frudan veritaban\u0131 sorgular\u0131n\u0131n kodun her yerine da\u011f\u0131lmas\u0131n\u0131 engeller ve i\u015f mant\u0131\u011f\u0131n\u0131 veritaban\u0131 detaylar\u0131ndan ay\u0131rarak daha temiz bir mimari sunar. Bu, \u00f6zellikle b\u00fcy\u00fck ve uzun \u00f6m\u00fcrl\u00fc projelerde b\u00fcy\u00fck bir avantajd\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>Performans optimizasyonu i\u00e7in ek olarak neler yap\u0131labilir?<\/strong><\/td>\n<td>Mitsuki kullan\u0131rken performans optimizasyonu i\u00e7in \u015funlar yap\u0131labilir: <\/p>\n<ul>\n<li><strong>Eager Loading (Hevesli Y\u00fckleme):<\/strong> \u0130li\u015fkili verileri tek sorguda getirmek i\u00e7in <code>withGraphFetched<\/code> gibi y\u00f6ntemleri kullan\u0131n.<\/li>\n<li><strong>\u0130ndeksleme:<\/strong> S\u0131k\u00e7a sorgulanan s\u00fctunlara veritaban\u0131nda indeksler ekleyin.<\/li>\n<li><strong>Sorgu Optimizasyonu:<\/strong> Karma\u015f\u0131k sorgular\u0131 optimize edin, gereksiz <code>JOIN<\/code> i\u015flemlerinden ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>Veri K\u00fcmesi Boyutunu Y\u00f6netme:<\/strong> Sayfalama (pagination) ve limit\/offset kullanarak b\u00fcy\u00fck veri k\u00fcmelerini k\u00fc\u00e7\u00fck par\u00e7alar halinde i\u015fleyin.<\/li>\n<li><strong>\u00d6nbellekleme (Caching):<\/strong> S\u0131k eri\u015filen ancak nadiren de\u011fi\u015fen veriler i\u00e7in \u00f6nbellekleme stratejileri uygulay\u0131n.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Mitsuki ile birle\u015fik sorgular (joins) nas\u0131l ele al\u0131n\u0131r?<\/strong><\/td>\n<td>Mitsuki'nin temelini olu\u015fturan ORM\/query builder, ili\u015fkisel veritabanlar\u0131ndaki birle\u015fik sorgular\u0131 (JOINs) destekler. <code>withGraphJoined<\/code> gibi metodlar, ili\u015fkili tablolar\u0131 JOIN kullanarak ana sorgunuza dahil etmenizi sa\u011flar. Bu, birden fazla tablodan gelen verileri tek bir sonu\u00e7 k\u00fcmesinde birle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir yoldur ve \u00f6zellikle raporlama veya karma\u015f\u0131k veri g\u00f6r\u00fcnt\u00fclerinde kullan\u0131l\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>Test yazarken Mitsuki'nin faydalar\u0131 nelerdir?<\/strong><\/td>\n<td>Mitsuki Repositories, test edilebilirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. \u0130\u015f mant\u0131\u011f\u0131n\u0131z\u0131 veritaban\u0131ndan soyutlad\u0131\u011f\u0131 i\u00e7in, ger\u00e7ek bir veritaban\u0131 ba\u011flant\u0131s\u0131 kurmadan repository'leri \"mock\" (sahte) edebilirsiniz. Bu, unit testlerin \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve test ortam\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu prensibi sayesinde, bir kontrolc\u00fcye veya servise sahte bir repository \u00f6rne\u011fi vererek, sadece o bile\u015fenin kendi mant\u0131\u011f\u0131n\u0131 test edebilirsiniz.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-35411","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Mitsuki Repositories: Zero&#039;dan Full CRUD&#039;a Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mitsuki Repositories: Zero&#039;dan Full CRUD&#039;a Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-29T07:01:08+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Mitsuki Repositories: Zero&#8217;dan Full CRUD&#8217;a Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-11-29T07:01:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\"},\"wordCount\":3787,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\",\"name\":\"Mitsuki Repositories: Zero'dan Full CRUD'a Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-29T07:01:08+00:00\",\"description\":\"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mitsuki Repositories: Zero&#8217;dan Full CRUD&#8217;a Kapsaml\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mitsuki Repositories: Zero'dan Full CRUD'a Kapsaml\u0131 Rehber","description":"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Mitsuki Repositories: Zero'dan Full CRUD'a Kapsaml\u0131 Rehber","og_description":"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.","og_url":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-29T07:01:08+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Mitsuki Repositories: Zero&#8217;dan Full CRUD&#8217;a Kapsaml\u0131 Rehber","datePublished":"2025-11-29T07:01:08+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/"},"wordCount":3787,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/","name":"Mitsuki Repositories: Zero'dan Full CRUD'a Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-29T07:01:08+00:00","description":"Veri y\u00f6netimi, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k ve hataya a\u00e7\u0131k olabilir. Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek ister misiniz? Bu kapsaml\u0131 rehber, Mitsuki Repositories ile tan\u0131\u015farak s\u0131f\u0131rdan ba\u015flay\u0131p, tam kapsaml\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi g\u00f6sterecek.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mitsuki-repositories-zerodan-full-cruda-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mitsuki Repositories: Zero&#8217;dan Full CRUD&#8217;a Kapsaml\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35411"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35411\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}