{"id":33600,"date":"2025-11-05T00:41:13","date_gmt":"2025-11-04T21:41:13","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33600"},"modified":"2025-11-05T00:41:13","modified_gmt":"2025-11-04T21:41:13","slug":"laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/","title":{"rendered":"Laravel Eloquent&#8217;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Laravel Eloquent&#8217;ta <code>where()<\/code> Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern web uygulamalar\u0131n\u0131n bel kemi\u011fi olan veritabanlar\u0131 ile etkile\u015fim, uygulaman\u0131n performans\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Laravel, PHP ekosistemindeki en pop\u00fcler framework&#8217;lerden biri olarak, veritaban\u0131 i\u015flemlerini basitle\u015ftirmek ve h\u0131zland\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir ORM (Object-Relational Mapper) olan Eloquent&#8217;\u0131 sunar. Eloquent, geli\u015ftiricilerin veritaban\u0131 tablolar\u0131n\u0131 PHP s\u0131n\u0131flar\u0131 olarak modellemesine ve SQL sorgular\u0131 yazmak yerine nesne y\u00f6nelimli bir yakla\u015f\u0131mla veri manip\u00fclasyonu yapmas\u0131na olanak tan\u0131r. Bu sayede, kod daha okunabilir, bak\u0131m\u0131 daha kolay ve daha az hataya a\u00e7\u0131k hale gelir.<\/p>\n<p>Eloquent&#8217;\u0131n sundu\u011fu say\u0131s\u0131z metod aras\u0131nda, veritaban\u0131ndan belirli ko\u015fullara uyan kay\u0131tlar\u0131 \u00e7ekmek i\u00e7in kullan\u0131lan <code>where()<\/code> metodu, \u015f\u00fcphesiz en temel ve en s\u0131k kullan\u0131lanlardan biridir. Ancak <code>where()<\/code> metodunun basit g\u00f6r\u00fcn\u00fcm\u00fcn\u00fcn ard\u0131nda, karma\u015f\u0131k sorgular\u0131 esnek ve verimli bir \u015fekilde olu\u015fturmaya olanak tan\u0131yan derin bir yetenek seti yatar. Bu makale, Laravel Eloquent&#8217;ta <code>where()<\/code> metodunun temelden ileri seviyeye kadar t\u00fcm y\u00f6nlerini kapsaml\u0131 bir \u015fekilde incelemeyi ama\u00e7lamaktad\u0131r. Temel kullan\u0131mlar\u0131ndan, geli\u015fmi\u015f k\u0131s\u0131tlama metotlar\u0131na, mant\u0131ksal grupland\u0131rmadan ili\u015fkisel sorgulara, ham SQL ifadelerinden performans ipu\u00e7lar\u0131na ve en iyi uygulamalara kadar geni\u015f bir yelpazede bilgi sunarak, geli\u015ftiricilerin veritaban\u0131 sorgular\u0131n\u0131 daha etkili bir \u015fekilde iyile\u015ftirmelerine yard\u0131mc\u0131 olmay\u0131 hedefliyoruz.<\/p>\n<p>Bu rehberin sonunda, <code>where()<\/code> metodunu kullanarak sadece do\u011fru veriyi \u00e7ekmekle kalmayacak, ayn\u0131 zamanda uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131racak ve daha s\u00fcrd\u00fcr\u00fclebilir, okunabilir kodlar yazman\u0131z\u0131 sa\u011flayacak bilgi ve becerilere sahip olacaks\u0131n\u0131z. Haydi, Eloquent&#8217;\u0131n sorgu olu\u015fturma g\u00fcc\u00fcn\u00fcn derinliklerine dalal\u0131m.<\/p>\n<h3>Eloquent ORM ve <code>where()<\/code> Metodunun Temelleri<\/h3>\n<p>Eloquent ORM, veritaban\u0131 tablolar\u0131n\u0131z\u0131 temsil eden &#8220;modeller&#8221; arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015f\u0131r. Her model, veritaban\u0131n\u0131zdaki belirli bir tabloyla ili\u015fkilidir. Bu modeller \u00fczerinde statik metotlar \u00e7a\u011f\u0131rarak veya bir modelin \u00f6rne\u011fini olu\u015fturarak veritaban\u0131 etkile\u015fimleri ger\u00e7ekle\u015ftirebilirsiniz. <code>where()<\/code> metodu, bir sorguya k\u0131s\u0131tlamalar eklemek i\u00e7in kullan\u0131lan temel yap\u0131 ta\u015f\u0131d\u0131r.<\/p>\n<h4>Temel <code>where()<\/code> Kullan\u0131m\u0131<\/h4>\n<p><code>where()<\/code> metodunun en basit hali, bir s\u00fctun ad\u0131 ve o s\u00fctunun almas\u0131 gereken de\u011feri belirterek \u00e7al\u0131\u015f\u0131r. Varsay\u0131lan olarak, bu, &#8220;e\u015fitlik&#8221; kontrol\u00fc yapar.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\n\n\/\/ 'email' s\u00fctunu 'john@example.com' olan ilk kullan\u0131c\u0131y\u0131 bul\n$user = User::where('email', 'john@example.com')->first();\n\n\/\/ 'status' s\u00fctunu 'active' olan t\u00fcm kullan\u0131c\u0131lar\u0131 getir\n$activeUsers = User::where('status', 'active')->get();\n<\/code><\/pre>\n<p>Bu kullan\u0131mda, Eloquent otomatik olarak e\u015fitlik (<code>=<\/code>) operat\u00f6r\u00fcn\u00fc varsayar. Ancak, farkl\u0131 kar\u015f\u0131la\u015ft\u0131rma operat\u00f6rleri kullanmak da m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h4>Kar\u015f\u0131la\u015ft\u0131rma Operat\u00f6rleri (<code>><\/code>, <code><<\/code>, <code>>=<\/code>, <code><=<\/code>, <code>!=<\/code>, <code><><\/code>)<\/h4>\n<p><code>where()<\/code> metodu, \u00fc\u00e7\u00fcnc\u00fc bir parametre olarak bir kar\u015f\u0131la\u015ft\u0131rma operat\u00f6r\u00fc alabilir. Bu, e\u015fitlik d\u0131\u015f\u0131ndaki ko\u015fullar\u0131 belirtmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\Product;\n\n\/\/ 'price' s\u00fctunu 100'den b\u00fcy\u00fck olan t\u00fcm \u00fcr\u00fcnleri getir\n$expensiveProducts = Product::where('price', '>', 100)->get();\n\n\/\/ 'stock' s\u00fctunu 50'den az veya e\u015fit olan \u00fcr\u00fcnleri getir\n$lowStockProducts = Product::where('stock', '<=&#039;, 50)->get();\n\n\/\/ 'category_id' s\u00fctunu 3'e e\u015fit olmayan \u00fcr\u00fcnleri getir\n$otherCategoryProducts = Product::where('category_id', '!=', 3)->get();\n\/\/ Veya alternatif olarak:\n\/\/ $otherCategoryProducts = Product::where('category_id', '<>', 3)->get();\n\n\/\/ 'created_at' s\u00fctunu belirli bir tarihten sonra olan kay\u0131tlar\u0131 getir\n$recentOrders = Order::where('created_at', '>', '2023-01-01')->get();\n<\/code><\/pre>\n<p>Bu esneklik, veritaban\u0131 sorgular\u0131n\u0131z\u0131 daha spesifik hale getirmenizi ve istedi\u011finiz veri setini daha hassas bir \u015fekilde elde etmenizi sa\u011flar.<\/p>\n<h3>Geli\u015fmi\u015f <code>where()<\/code> K\u0131s\u0131tlamalar\u0131<\/h3>\n<p>Eloquent, temel <code>where()<\/code> metodunun \u00f6tesinde, daha yayg\u0131n sorgulama senaryolar\u0131 i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir dizi kolayl\u0131k metodu sunar. Bu metotlar, kodunuzu daha okunabilir hale getirirken, karma\u015f\u0131k SQL ifadeleri yazma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<h4>Liste ve Aral\u0131k K\u0131s\u0131tlamalar\u0131<\/h4>\n<p>Belirli bir de\u011fer listesi i\u00e7inde veya belirli bir de\u011fer aral\u0131\u011f\u0131nda olan kay\u0131tlar\u0131 filtrelemek i\u00e7in bu metotlar kullan\u0131l\u0131r.<\/p>\n<ul>\n<li><code>whereIn($column, array $values)<\/code>: Belirtilen s\u00fctunun de\u011ferinin verilen dizideki de\u011ferlerden herhangi birine e\u015fit oldu\u011fu kay\u0131tlar\u0131 getirir.<\/li>\n<li><code>whereNotIn($column, array $values)<\/code>: Belirtilen s\u00fctunun de\u011ferinin verilen dizideki de\u011ferlerden hi\u00e7birine e\u015fit olmad\u0131\u011f\u0131 kay\u0131tlar\u0131 getirir.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\n\n\/\/ 'id' s\u00fctunu 1, 5 veya 10 olan kullan\u0131c\u0131lar\u0131 getir\n$specificUsers = User::whereIn('id', [1, 5, 10])->get();\n\n\/\/ 'status' s\u00fctunu 'pending' veya 'cancelled' olmayan sipari\u015fleri getir\n$activeOrders = Order::whereNotIn('status', ['pending', 'cancelled'])->get();\n<\/code><\/pre>\n<ul>\n<li><code>whereBetween($column, array $values)<\/code>: Belirtilen s\u00fctunun de\u011ferinin iki de\u011fer aras\u0131nda (dahil) oldu\u011fu kay\u0131tlar\u0131 getirir.<\/li>\n<li><code>whereNotBetween($column, array $values)<\/code>: Belirtilen s\u00fctunun de\u011ferinin iki de\u011fer aras\u0131nda (dahil) olmad\u0131\u011f\u0131 kay\u0131tlar\u0131 getirir.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\Product;\n\n\/\/ 'price' s\u00fctunu 50 ile 200 aras\u0131nda (dahil) olan \u00fcr\u00fcnleri getir\n$midRangeProducts = Product::whereBetween('price', [50, 200])->get();\n\n\/\/ 'created_at' s\u00fctunu belirli bir tarih aral\u0131\u011f\u0131nda olmayan kay\u0131tlar\u0131 getir\n$outOfRangeLogins = LoginAttempt::whereNotBetween('created_at', ['2023-01-01', '2023-01-31'])->get();\n<\/code><\/pre>\n<h4>Null De\u011fer K\u0131s\u0131tlamalar\u0131<\/h4>\n<p>Bir s\u00fctunun <code>NULL<\/code> olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in \u00f6zel metotlar mevcuttur. Bu, <code>where('column', '=', null)<\/code> yazmaktan daha okunabilir bir yoldur.<\/p>\n<ul>\n<li><code>whereNull($column)<\/code>: Belirtilen s\u00fctunun de\u011ferinin <code>NULL<\/code> oldu\u011fu kay\u0131tlar\u0131 getirir.<\/li>\n<li><code>whereNotNull($column)<\/code>: Belirtilen s\u00fctunun de\u011ferinin <code>NULL<\/code> olmad\u0131\u011f\u0131 kay\u0131tlar\u0131 getirir.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\n\n\/\/ 'email_verified_at' s\u00fctunu NULL olan kullan\u0131c\u0131lar\u0131 (do\u011frulanmam\u0131\u015f) getir\n$unverifiedUsers = User::whereNull('email_verified_at')->get();\n\n\/\/ 'deleted_at' s\u00fctunu NULL olmayan (silinmi\u015f) kay\u0131tlar\u0131 getir\n$deletedItems = Item::whereNotNull('deleted_at')->get();\n<\/code><\/pre>\n<h4>Tarih ve Zaman K\u0131s\u0131tlamalar\u0131<\/h4>\n<p>Veritaban\u0131n\u0131zdaki tarih ve zaman s\u00fctunlar\u0131 \u00fczerinde daha spesifik filtrelemeler yapmak i\u00e7in bir dizi kullan\u0131\u015fl\u0131 metot bulunur.<\/p>\n<ul>\n<li><code>whereDate($column, $operator, $value)<\/code>: S\u00fctunun tarih k\u0131sm\u0131n\u0131 belirli bir de\u011fere g\u00f6re kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/li>\n<li><code>whereMonth($column, $operator, $value)<\/code>: S\u00fctunun ay k\u0131sm\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/li>\n<li><code>whereDay($column, $operator, $value)<\/code>: S\u00fctunun g\u00fcn k\u0131sm\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/li>\n<li><code>whereYear($column, $operator, $value)<\/code>: S\u00fctunun y\u0131l k\u0131sm\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/li>\n<li><code>whereTime($column, $operator, $value)<\/code>: S\u00fctunun zaman k\u0131sm\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\Post;\nuse Carbon\\Carbon;\n\n\/\/ Belirli bir tarihte olu\u015fturulan t\u00fcm g\u00f6nderileri getir\n$postsOnSpecificDate = Post::whereDate('created_at', '2023-10-26')->get();\n\n\/\/ Belirli bir aydaki g\u00f6nderileri getir (\u00f6rne\u011fin, Ekim ay\u0131ndaki)\n$postsInOctober = Post::whereMonth('created_at', 10)->get();\n\n\/\/ Ge\u00e7en y\u0131l olu\u015fturulan g\u00f6nderileri getir\n$postsLastYear = Post::whereYear('created_at', Carbon::now()->subYear()->year)->get();\n\n\/\/ Belirli bir saatten sonra olu\u015fturulan g\u00f6nderileri getir\n$postsAfternoon = Post::whereTime('created_at', '>', '12:00:00')->get();\n<\/code><\/pre>\n<h4>S\u00fctun Kar\u015f\u0131la\u015ft\u0131rmalar\u0131<\/h4>\n<p>Bazen bir s\u00fctunun de\u011ferini sabit bir de\u011fere g\u00f6re de\u011fil, ayn\u0131 tablodaki ba\u015fka bir s\u00fctunun de\u011ferine g\u00f6re kar\u015f\u0131la\u015ft\u0131rmak isteyebilirsiniz.<\/p>\n<ul>\n<li><code>whereColumn($firstColumn, $operator, $secondColumn)<\/code>: Bir s\u00fctunun de\u011ferini ba\u015fka bir s\u00fctunun de\u011feriyle kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\Order;\n\n\/\/ 'shipped_at' s\u00fctunu 'created_at' s\u00fctunundan sonra olan sipari\u015fleri getir\n$delayedOrders = Order::whereColumn('shipped_at', '>', 'created_at')->get();\n\n\/\/ 'quantity' s\u00fctunu 'min_quantity' s\u00fctunundan az olan \u00fcr\u00fcnleri getir\n$understockedItems = Product::whereColumn('quantity', '<&#039;, &#039;min_quantity&#039;)->get();\n<\/code><\/pre>\n<p>Bu \u00f6zel <code>where()<\/code> metotlar\u0131, yayg\u0131n sorgulama ihtiya\u00e7lar\u0131n\u0131 zarif ve okunabilir bir \u015fekilde kar\u015f\u0131layarak geli\u015ftirici deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<h3>Mant\u0131ksal Grupland\u0131rma ve Karma\u015f\u0131k Sorgular<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, veritaban\u0131 sorgular\u0131 genellikle birden fazla ko\u015fulu i\u00e7erir ve bu ko\u015fullar\u0131n birbiriyle mant\u0131ksal olarak nas\u0131l ili\u015fkilendirilece\u011fi (AND, OR) b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Eloquent, bu t\u00fcr karma\u015f\u0131k senaryolar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar.<\/p>\n<h4><code>AND<\/code> ve <code>OR<\/code> Operat\u00f6rleri<\/h4>\n<p>Varsay\u0131lan olarak, Eloquent'ta zincirleme olarak kullan\u0131lan t\u00fcm <code>where()<\/code> metotlar\u0131 bir <code>AND<\/code> operat\u00f6r\u00fc ile birle\u015ftirilir. Bu, t\u00fcm ko\u015fullar\u0131n do\u011fru olmas\u0131 gerekti\u011fi anlam\u0131na gelir.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\n\n\/\/ 'status'u 'active' VE 'role'\u00fc 'admin' olan kullan\u0131c\u0131lar\u0131 getir\n$adminUsers = User::where('status', 'active')\n                   ->where('role', 'admin')\n                   ->get();\n\/\/ SQL: SELECT * FROM users WHERE status = 'active' AND role = 'admin';\n<\/code><\/pre>\n<p>Ancak, ko\u015fullardan birinin veya di\u011ferinin do\u011fru olmas\u0131n\u0131 istedi\u011finiz durumlar i\u00e7in <code>orWhere()<\/code> metodunu kullanabilirsiniz.<\/p>\n<ul>\n<li><code>orWhere($column, $operator, $value)<\/code>: Mevcut sorguya bir <code>OR<\/code> ko\u015fulu ekler.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\Product;\n\n\/\/ 'stock'u 0 olan VEYA 'status'u 'inactive' olan \u00fcr\u00fcnleri getir\n$unavailableProducts = Product::where('stock', 0)\n                              ->orWhere('status', 'inactive')\n                              ->get();\n\/\/ SQL: SELECT * FROM products WHERE stock = 0 OR status = 'inactive';\n<\/code><\/pre>\n<h4>\u0130\u00e7 \u0130\u00e7e <code>where()<\/code> K\u0131s\u0131tlamalar\u0131 (Grupland\u0131rma)<\/h4>\n<p>Ger\u00e7ek karma\u015f\u0131kl\u0131k, <code>AND<\/code> ve <code>OR<\/code> operat\u00f6rlerini kar\u0131\u015ft\u0131rarak ve grupland\u0131rarak ortaya \u00e7\u0131kar. SQL'deki parantezlerle (<code>()<\/code>) yap\u0131lan grupland\u0131rmalar gibi, Eloquent'ta da closure (kapan\u0131\u015f) kullanarak mant\u0131ksal gruplar olu\u015fturabilirsiniz. Bu, daha okunabilir ve kontrol edilebilir sorgular yazman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\Order;\n\n\/\/ 'status'u 'pending' olan VE ('amount'\u0131 100'den b\u00fcy\u00fck VEYA 'customer_id'si 5 olan) sipari\u015fleri getir\n$complexOrders = Order::where('status', 'pending')\n                      ->where(function ($query) {\n                          $query->where('amount', '>', 100)\n                                ->orWhere('customer_id', 5);\n                      })\n                      ->get();\n\/*\nSQL: SELECT * FROM orders WHERE status = 'pending' AND (amount > 100 OR customer_id = 5);\n*\/\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, i\u00e7teki <code>where()<\/code> closure'\u0131, <code>amount > 100 OR customer_id = 5<\/code> ko\u015fulunu ayr\u0131 bir mant\u0131ksal grup olarak ele al\u0131r. Bu grup, d\u0131\u015ftaki <code>status = 'pending'<\/code> ko\u015fuluyla bir <code>AND<\/code> operat\u00f6r\u00fcyle birle\u015ftirilir. Bu yap\u0131, SQL'deki parantez kullan\u0131m\u0131na e\u015fde\u011ferdir ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 sorgular\u0131n\u0131za uygulaman\u0131n anahtar\u0131d\u0131r.<\/p>\n<p>Birden fazla i\u00e7 i\u00e7e grupland\u0131rma da m\u00fcmk\u00fcnd\u00fcr:<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\Ticket;\n\n\/\/ ('status'u 'open' VE 'priority'si 'high') VEYA ('assigned_to'su NULL VE 'created_at'\u0131 son 24 saat i\u00e7inde) olan biletleri getir\n$urgentTickets = Ticket::where(function ($query) {\n                          $query->where('status', 'open')\n                                ->where('priority', 'high');\n                      })->orWhere(function ($query) {\n                          $query->whereNull('assigned_to')\n                                ->where('created_at', '>', now()->subDay());\n                      })->get();\n\/*\nSQL: SELECT * FROM tickets WHERE (status = 'open' AND priority = 'high') OR (assigned_to IS NULL AND created_at > ...);\n*\/\n<\/code><\/pre>\n<p>Closure'lar, sorgu olu\u015fturucunun mevcut durumunu al\u0131r ve bu durum \u00fczerinde yeni k\u0131s\u0131tlamalar eklemenize olanak tan\u0131r. Bu, sorgular\u0131n\u0131z\u0131 mod\u00fcler ve y\u00f6netilebilir hale getirir.<\/p>\n<h3>\u0130li\u015fkisel Sorgularda <code>where()<\/code> Kullan\u0131m\u0131<\/h3>\n<p>Eloquent'\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, modeller aras\u0131ndaki ili\u015fkileri tan\u0131mlama yetene\u011fidir. Bu ili\u015fkileri kullanarak, ana modelin kay\u0131tlar\u0131n\u0131, ili\u015fkili modeldeki verilere g\u00f6re filtrelemek s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir senaryodur. <code>whereHas()<\/code> ve <code>whereDoesntHave()<\/code> metotlar\u0131 bu ihtiyac\u0131 kar\u015f\u0131lar.<\/p>\n<h4><code>whereHas()<\/code> ve <code>whereDoesntHave()<\/code><\/h4>\n<p><code>whereHas($relation, Closure $callback = null)<\/code> metodu, belirli bir ili\u015fkiye sahip olan ve bu ili\u015fkideki kay\u0131tlar\u0131n belirli ko\u015fullar\u0131 sa\u011flad\u0131\u011f\u0131 ana model kay\u0131tlar\u0131n\u0131 filtrelemek i\u00e7in kullan\u0131l\u0131r. \u0130kinci parametre olarak iste\u011fe ba\u011fl\u0131 bir closure alarak, ili\u015fkili model \u00fczerinde ek k\u0131s\u0131tlamalar tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\Post;\nuse App\\Models\\Comment;\n\n\/\/ En az bir yoruma sahip t\u00fcm g\u00f6nderileri getir\n$postsWithComments = Post::whereHas('comments')->get();\n\n\/\/ Belirli bir kelimeyi i\u00e7eren yorumlara sahip g\u00f6nderileri getir\n$postsWithSpecificComments = Post::whereHas('comments', function ($query) {\n    $query->where('content', 'like', '%harika%');\n})->get();\n\n\/\/ Yorum say\u0131s\u0131 5'ten fazla olan g\u00f6nderileri getir\n$popularPosts = Post::whereHas('comments', function ($query) {\n    $query->where('is_approved', true); \/\/ Sadece onayl\u0131 yorumlar\u0131 say\n}, '>=', 5)->get(); \/\/ Yorum say\u0131s\u0131 5'ten b\u00fcy\u00fck veya e\u015fit\n<\/code><\/pre>\n<p><code>whereHas()<\/code> metodunun \u00fc\u00e7\u00fcnc\u00fc ve d\u00f6rd\u00fcnc\u00fc parametreleri, ili\u015fkili kay\u0131tlar\u0131n say\u0131s\u0131n\u0131 k\u0131s\u0131tlamak i\u00e7in kullan\u0131labilir (\u00f6rne\u011fin, \"en az 5 yorumu olan g\u00f6nderiler\").<\/p>\n<p><code>whereDoesntHave($relation, Closure $callback = null)<\/code> metodu ise, belirli bir ili\u015fkiye sahip olmayan veya bu ili\u015fkideki kay\u0131tlar\u0131n belirli ko\u015fullar\u0131 sa\u011flamad\u0131\u011f\u0131 ana model kay\u0131tlar\u0131n\u0131 filtrelemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\nuse App\\Models\\Order;\n\n\/\/ Hi\u00e7 sipari\u015fi olmayan kullan\u0131c\u0131lar\u0131 getir\n$usersWithoutOrders = User::whereDoesntHave('orders')->get();\n\n\/\/ Hen\u00fcz 'shipped' durumunda bir sipari\u015fi olmayan kullan\u0131c\u0131lar\u0131 getir\n$usersWithoutShippedOrders = User::whereDoesntHave('orders', function ($query) {\n    $query->where('status', 'shipped');\n})->get();\n<\/code><\/pre>\n<h4>\u0130li\u015fkisel K\u0131s\u0131tlamalarda Detayland\u0131rma<\/h4>\n<p><code>whereHas()<\/code> ve <code>whereDoesntHave()<\/code> metotlar\u0131, i\u00e7 closure'lar sayesinde ili\u015fkili model \u00fczerinde herhangi bir <code>where()<\/code> veya di\u011fer sorgu olu\u015fturucu metodunu kullanman\u0131za olanak tan\u0131r. Bu, \u00e7ok spesifik ili\u015fkisel filtrelemeler yapman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\Category;\nuse App\\Models\\Product;\n\n\/\/ Belirli bir kategoride (\u00f6rne\u011fin 'Electronics' kategorisi) aktif \u00fcr\u00fcn\u00fc olan kategorileri getir\n$categoriesWithActiveElectronics = Category::whereHas('products', function ($query) {\n    $query->where('status', 'active')\n          ->where('price', '>', 50);\n})->get();\n<\/code><\/pre>\n<p>Bu metotlar, N+1 sorgu problemini \u00f6nlemek i\u00e7in <code>with()<\/code> metoduyla birlikte kullan\u0131ld\u0131\u011f\u0131nda daha da verimli hale gelir. <code>whereHas()<\/code> sadece filtreleme yaparken, <code>with()<\/code> ili\u015fkili verileri de getirir.<\/p>\n<h3>Ham SQL \u0130fadeleri ve <code>whereRaw()<\/code><\/h3>\n<p>Eloquent, \u00e7o\u011fu durumda yeterli olsa da, bazen \u00e7ok \u00f6zel veya karma\u015f\u0131k SQL ifadeleri yazman\u0131z gerekebilir. Bu gibi durumlarda, Eloquent'\u0131n sorgu olu\u015fturucusuna ham SQL par\u00e7ac\u0131klar\u0131 eklemenize olanak tan\u0131yan <code>whereRaw()<\/code> metodu devreye girer.<\/p>\n<h4><code>whereRaw()<\/code> Kullan\u0131m\u0131 ve G\u00fcvenlik<\/h4>\n<p><code>whereRaw($sql, array $bindings = [])<\/code> metodu, do\u011frudan bir SQL <code>WHERE<\/code> ko\u015fulu yazman\u0131za izin verir. Bu, Eloquent'\u0131n kendi metotlar\u0131yla ifade edilemeyen karma\u015f\u0131k ko\u015fullar veya veritaban\u0131na \u00f6zg\u00fc fonksiyonlar kullanman\u0131z gerekti\u011finde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\n\n\/\/ Veritaban\u0131n\u0131n CURDATE() fonksiyonunu kullanarak bug\u00fcn do\u011fan kullan\u0131c\u0131lar\u0131 bul\n$birthdayUsers = User::whereRaw('DATE(date_of_birth) = CURDATE()')->get();\n\n\/\/ \u0130ki s\u00fctunun birle\u015ftirilmi\u015f de\u011ferini filtrele\n$usersWithFullName = User::whereRaw(\"CONCAT(first_name, ' ', last_name) = ?\", ['John Doe'])->get();\n<\/code><\/pre>\n<p><code>whereRaw()<\/code> kullan\u0131rken <strong>SQL Injection<\/strong> g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 dikkatli olmak \u00e7ok \u00f6nemlidir. Do\u011frudan kullan\u0131c\u0131 giri\u015fini ham SQL ifadesine eklemek yerine, ikinci parametre olarak bir ba\u011flama (binding) dizisi sa\u011flaman\u0131z \u015fiddetle tavsiye edilir. Bu, Eloquent'\u0131n PDO'nun haz\u0131rlanm\u0131\u015f ifadelerini (prepared statements) kullanarak SQL injection'\u0131 otomatik olarak \u00f6nlemesini sa\u011flar.<\/p>\n<pre><code class=\"language-php\">\n\/\/ G\u00fcvenli kullan\u0131m: ? ile parametre ba\u011flama\n$searchQuery = 'john';\n$users = User::whereRaw('name LIKE ? OR email LIKE ?', [\"%{$searchQuery}%\", \"%{$searchQuery}%\"])->get();\n\n\/\/ K\u00f6t\u00fc kullan\u0131m (SQL injection riski ta\u015f\u0131yan):\n\/\/ $searchQuery = \"john' OR 1=1 --\"; \/\/ K\u00f6t\u00fc niyetli giri\u015f\n\/\/ $users = User::whereRaw(\"name LIKE '%{$searchQuery}%'\")->get(); \/\/ SQL injection'a a\u00e7\u0131k!\n<\/code><\/pre>\n<p>Her zaman ba\u011flama kullan\u0131n ve kullan\u0131c\u0131dan gelen veriyi do\u011frudan SQL dizelerine eklemekten ka\u00e7\u0131n\u0131n.<\/p>\n<h4><code>orWhereRaw()<\/code><\/h4>\n<p><code>whereRaw()<\/code> metodunun bir <code>OR<\/code> versiyonu olan <code>orWhereRaw($sql, array $bindings = [])<\/code> da mevcuttur. Bu, mevcut sorguya bir <code>OR<\/code> operat\u00f6r\u00fcyle ham SQL ko\u015fullar\u0131 eklemenizi sa\u011flar.<\/p>\n<pre><code class=\"language-php\">\nuse App\\Models\\Product;\n\n\/\/ 'stock'u 0 olan VEYA 'price'\u0131 100'den b\u00fcy\u00fck olan \u00fcr\u00fcnleri getir\n$products = Product::where('stock', 0)\n                   ->orWhereRaw('price > ?', [100])\n                   ->get();\n\/*\nSQL: SELECT * FROM products WHERE stock = 0 OR price > 100;\n*\/\n<\/code><\/pre>\n<p><code>whereRaw()<\/code> ve <code>orWhereRaw()<\/code> metotlar\u0131, Eloquent'\u0131n yeteneklerinin \u00f6tesine ge\u00e7meniz gerekti\u011finde g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r, ancak g\u00fcvenlik ve okunabilirlik a\u00e7\u0131s\u0131ndan dikkatli kullan\u0131lmalar\u0131 gerekir. M\u00fcmk\u00fcn oldu\u011funca Eloquent'\u0131n kendi metotlar\u0131n\u0131 tercih etmek, kodunuzu daha s\u00fcrd\u00fcr\u00fclebilir hale getirecektir.<\/p>\n<h3>Sorgu Hatalar\u0131n\u0131 Ay\u0131klama ve Performans \u0130pu\u00e7lar\u0131<\/h3>\n<p>Veritaban\u0131 sorgular\u0131n\u0131 olu\u015fturmak bir sanatt\u0131r, ancak bu sorgular\u0131n beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve performansl\u0131 oldu\u011fundan emin olmak da bir bilimdir. Laravel, sorgular\u0131 ay\u0131klamak ve optimize etmek i\u00e7in \u00e7e\u015fitli ara\u00e7lar ve teknikler sunar.<\/p>\n<h4>Sorgular\u0131 \u0130nceleme<\/h4>\n<p>Bir Eloquent sorgusunun nihai olarak hangi SQL ifadesine d\u00f6n\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc g\u00f6rmek, hatalar\u0131 ay\u0131klaman\u0131n en etkili yollar\u0131ndan biridir.<\/p>\n<ul>\n<li><code>toSql()<\/code>: Sorgu olu\u015fturucunun mevcut durumunu temsil eden ham SQL dizesini d\u00f6nd\u00fcr\u00fcr. Bu, sorguyu \u00e7al\u0131\u015ft\u0131rmaz, sadece SQL'i g\u00f6sterir.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\User;\n\n$query = User::where('status', 'active')\n             ->where('created_at', '>', '2023-01-01');\n\necho $query->toSql();\n\/\/ \u00c7\u0131kt\u0131: SELECT * FROM users WHERE status = ? AND created_at > ?\n<\/code><\/pre>\n<p><code>toSql()<\/code> metodu, ba\u011flama de\u011ferlerini g\u00f6stermez. Ba\u011flama de\u011ferlerini g\u00f6rmek i\u00e7in <code>getBindings()<\/code> metodunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-php\">\n$bindings = $query->getBindings();\nprint_r($bindings);\n\/\/ \u00c7\u0131kt\u0131: Array ( [0] => active [1] => 2023-01-01 )\n<\/code><\/pre>\n<ul>\n<li><code>dd()<\/code> (Dump and Die): Laravel'in global yard\u0131mc\u0131 fonksiyonu olan <code>dd()<\/code>, bir de\u011fi\u015fkenin i\u00e7eri\u011fini ekrana basar ve uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 durdurur. Sorgu olu\u015fturucuyu <code>dd()<\/code> i\u00e7ine alarak, hem SQL'i hem de ba\u011flamalar\u0131 i\u00e7eren ayr\u0131nt\u0131l\u0131 bir \u00e7\u0131kt\u0131 alabilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse App\\Models\\Product;\n\n$products = Product::where('price', '>', 100)\n                   ->where('stock', '<&#039;, 10);\n\ndd($products->toSql(), $products->getBindings());\n\/\/ \u00c7\u0131kt\u0131: SQL dizesi ve ba\u011flama dizisi ayr\u0131 ayr\u0131 g\u00f6sterilir.\n<\/code><\/pre>\n<ul>\n<li><code>DB::listen()<\/code>: Uygulaman\u0131zda \u00e7al\u0131\u015fan t\u00fcm veritaban\u0131 sorgular\u0131n\u0131 dinlemenizi sa\u011flayan bir olay dinleyicisidir. Bu, uygulaman\u0131z\u0131n herhangi bir noktas\u0131nda hangi sorgular\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc g\u00f6rmek i\u00e7in harika bir ara\u00e7t\u0131r. Genellikle <code>AppServiceProvider<\/code> i\u00e7inde veya \u00f6zel bir servis sa\u011flay\u0131c\u0131da tan\u0131mlan\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-php\">\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Log;\n\n\/\/ AppServiceProvider'\u0131n boot metodunda\npublic function boot()\n{\n    DB::listen(function ($query) {\n        Log::info(\n            $query->sql,\n            $query->bindings,\n            $query->time\n        );\n    });\n}\n<\/code><\/pre>\n<p>Bu dinleyici sayesinde, t\u00fcm sorgular\u0131n\u0131z\u0131n log dosyalar\u0131na kaydedilmesini sa\u011flayabilir, b\u00f6ylece yava\u015f veya hatal\u0131 sorgular\u0131 kolayca tespit edebilirsiniz.<\/p>\n<h4>Performans Optimizasyonu<\/h4>\n<p><code>where()<\/code> metotlar\u0131n\u0131 kullan\u0131rken performans\u0131 art\u0131rmak i\u00e7in g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken baz\u0131 \u00f6nemli noktalar:<\/p>\n<ul>\n<li><strong>\u0130ndeksleme (Indexes):<\/strong> Veritaban\u0131 tablolar\u0131n\u0131zda s\u0131k\u00e7a sorgulanan s\u00fctunlara (\u00f6zellikle <code>WHERE<\/code>, <code>ORDER BY<\/code> ve <code>JOIN<\/code> ko\u015fullar\u0131nda kullan\u0131lan s\u00fctunlara) indeks eklemek, sorgu performans\u0131n\u0131 dramatik bir \u015fekilde art\u0131rabilir. \u0130ndeksler, veritaban\u0131n\u0131n belirli kay\u0131tlar\u0131 daha h\u0131zl\u0131 bulmas\u0131na yard\u0131mc\u0131 olan bir t\u00fcr arama tablosu g\u00f6revi g\u00f6r\u00fcr. \u00d6rne\u011fin, <code>User::where('email', 'john@example.com')->first()<\/code> sorgusunda <code>email<\/code> s\u00fctununda bir indeks olmas\u0131, sorgunun \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Eager Loading (<code>with()<\/code>):<\/strong> \u0130li\u015fkisel sorgularda <code>whereHas()<\/code> kullan\u0131rken, ili\u015fkili verileri de \u00e7ekmek istiyorsan\u0131z (N+1 sorgu problemini \u00f6nlemek i\u00e7in), <code>with()<\/code> metodunu kullanmay\u0131 unutmay\u0131n. <code>whereHas()<\/code> sadece filtreleme yaparken, <code>with()<\/code> ili\u015fkili verileri de getirir.<\/li>\n<pre><code class=\"language-php\">\n    \/\/ N+1 problemine yol a\u00e7ar (her post i\u00e7in ayr\u0131 yorum sorgusu)\n    $posts = Post::whereHas('comments', function ($query) {\n        $query->where('content', 'like', '%harika%');\n    })->get();\n    foreach ($posts as $post) {\n        echo $post->comments->count(); \/\/ Her \u00e7a\u011fr\u0131da yeni sorgu\n    }\n\n    \/\/ Eager loading ile N+1 problemini \u00f6nler\n    $posts = Post::with('comments')->whereHas('comments', function ($query) {\n        $query->where('content', 'like', '%harika%');\n    })->get();\n    foreach ($posts as $post) {\n        echo $post->comments->count(); \/\/ \u0130li\u015fkili veriler tek sorgu ile \u00e7ekildi\n    }\n    <\/code><\/pre>\n<li><strong><code>select()<\/code> ile Gereksiz S\u00fctunlardan Ka\u00e7\u0131nma:<\/strong> \u00d6zellikle b\u00fcy\u00fck tablolarda, <code>SELECT *<\/code> (t\u00fcm s\u00fctunlar\u0131 \u00e7ekme) yerine yaln\u0131zca ihtiyac\u0131n\u0131z olan s\u00fctunlar\u0131 <code>select()<\/code> metoduyla belirtmek, hem a\u011f trafi\u011fini azalt\u0131r hem de veritaban\u0131 sunucusundaki y\u00fck\u00fc hafifletir.<\/li>\n<pre><code class=\"language-php\">\n    \/\/ T\u00fcm s\u00fctunlar\u0131 \u00e7eker (gereksiz olabilir)\n    $users = User::where('status', 'active')->get();\n\n    \/\/ Sadece 'id', 'name' ve 'email' s\u00fctunlar\u0131n\u0131 \u00e7eker\n    $users = User::select('id', 'name', 'email')->where('status', 'active')->get();\n    <\/code><\/pre>\n<\/ul>\n<p>Bu ipu\u00e7lar\u0131, Laravel uygulaman\u0131z\u0131n veritaban\u0131 etkile\u015fimlerini daha verimli hale getirmenize ve daha iyi bir kullan\u0131c\u0131 deneyimi sunman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3><code>where()<\/code> Metodu ile En \u0130yi Uygulamalar<\/h3>\n<p>Veritaban\u0131 sorgular\u0131n\u0131 yazarken sadece i\u015flevselli\u011fi de\u011fil, ayn\u0131 zamanda kodun kalitesini, g\u00fcvenli\u011fini ve performans\u0131n\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. \u0130\u015fte <code>where()<\/code> metotlar\u0131n\u0131 kullan\u0131rken uygulayabilece\u011finiz baz\u0131 en iyi uygulamalar:<\/p>\n<ul>\n<li><strong>Eloquent Metotlar\u0131n\u0131 Tercih Edin:<\/strong> M\u00fcmk\u00fcn oldu\u011funca <code>whereRaw()<\/code> gibi ham SQL metotlar\u0131 yerine Eloquent'\u0131n kendi \u00f6zel <code>where()<\/code> metotlar\u0131n\u0131 (<code>whereIn<\/code>, <code>whereBetween<\/code>, <code>whereNull<\/code> vb.) kullan\u0131n. Bu, kodunuzu daha okunabilir, daha g\u00fcvenli ve veritaban\u0131ndan ba\u011f\u0131ms\u0131z (database-agnostic) hale getirir. Eloquent metotlar\u0131, SQL injection gibi yayg\u0131n g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 yerle\u015fik koruma sa\u011flar.<\/li>\n<li><strong>Kullan\u0131c\u0131 Giri\u015flerini G\u00fcvenli Hale Getirin:<\/strong> Kullan\u0131c\u0131dan gelen herhangi bir veriyi sorgular\u0131n\u0131zda kullan\u0131rken her zaman ba\u011flama (binding) kullan\u0131n. <code>where()<\/code> metotlar\u0131 bunu otomatik olarak yaparken, <code>whereRaw()<\/code> kullan\u0131yorsan\u0131z mutlaka ikinci parametre olarak ba\u011flama dizisini sa\u011flay\u0131n. Asla kullan\u0131c\u0131dan gelen veriyi do\u011frudan SQL dizelerine birle\u015ftirmeyin.<\/li>\n<li><strong>S\u00fctunlar\u0131 \u0130ndeksleyin:<\/strong> S\u0131k\u00e7a sorgulanan, filtrelenen veya s\u0131ralanan s\u00fctunlara veritaban\u0131 indeksleri ekleyin. \u00d6zellikle <code>WHERE<\/code> ko\u015fullar\u0131nda kullan\u0131lan s\u00fctunlar i\u00e7in indeksler sorgu h\u0131z\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131rabilir. Ancak, \u00e7ok fazla indeks eklemenin yazma (INSERT, UPDATE, DELETE) i\u015flemlerini yava\u015flatabilece\u011fini unutmay\u0131n; bu nedenle indeksleri ak\u0131ll\u0131ca se\u00e7in.<\/li>\n<li><strong>Sorgular\u0131 Okunabilir Tutun:<\/strong> Karma\u015f\u0131k sorgular\u0131 par\u00e7alara ay\u0131r\u0131n ve mant\u0131ksal grupland\u0131rmalar i\u00e7in closure'lar\u0131 (i\u00e7 i\u00e7e <code>where()<\/code>) kullan\u0131n. Bu, sorgular\u0131n\u0131z\u0131n amac\u0131n\u0131 daha net hale getirir ve gelecekteki bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Uzun ve karma\u015f\u0131k tek bir zincir yerine, mant\u0131ksal bloklar olu\u015fturun.<\/li>\n<li><strong>D\u00f6ng\u00fcler \u0130\u00e7inde Sorgu \u00c7al\u0131\u015ft\u0131rmaktan Ka\u00e7\u0131n\u0131n (N+1 Problemi):<\/strong> Bir d\u00f6ng\u00fc i\u00e7inde her yinelemede veritaban\u0131na yeni sorgular g\u00f6ndermek (N+1 problemi olarak bilinir), uygulaman\u0131z\u0131n performans\u0131n\u0131 ciddi \u015fekilde d\u00fc\u015f\u00fcrebilir. \u0130li\u015fkili verileri \u00e7ekerken <code>with()<\/code> metoduyla eager loading (hevesli y\u00fckleme) kullanarak bu durumdan ka\u00e7\u0131n\u0131n. Benzer \u015fekilde, birden fazla \u00f6\u011fe \u00fczerinde ayn\u0131 sorguyu tekrar tekrar \u00e7al\u0131\u015ft\u0131rmak yerine, <code>whereIn()<\/code> gibi toplu sorgulama metotlar\u0131n\u0131 kullan\u0131n.<\/li>\n<li><strong>Sorgular\u0131 Test Edin ve Profilleyin:<\/strong> Geli\u015ftirme ortam\u0131n\u0131zda sorgular\u0131n\u0131z\u0131n performans\u0131n\u0131 d\u00fczenli olarak test edin ve profilleyin. <code>DB::listen()<\/code>, Laravel Debugbar gibi ara\u00e7lar veya veritaban\u0131n\u0131z\u0131n kendi sorgu analiz ara\u00e7lar\u0131 (\u00f6rne\u011fin MySQL'in <code>EXPLAIN<\/code> komutu), performans darbo\u011fazlar\u0131n\u0131 belirlemenize yard\u0131mc\u0131 olabilir.<\/li>\n<\/ul>\n<p>Bu en iyi uygulamalar\u0131 takip ederek, Laravel Eloquent ile yazd\u0131\u011f\u0131n\u0131z veritaban\u0131 sorgular\u0131n\u0131n hem g\u00fc\u00e7l\u00fc hem de s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Laravel Eloquent'\u0131n <code>where()<\/code> metodu, veritaban\u0131 sorgular\u0131n\u0131 olu\u015fturman\u0131n ve iyile\u015ftirmenin temel ta\u015f\u0131d\u0131r. Bu makale boyunca, temel e\u015fitlik kontrollerinden, geli\u015fmi\u015f liste ve aral\u0131k k\u0131s\u0131tlamalar\u0131na, tarih ve zaman filtrelemelerinden s\u00fctun kar\u015f\u0131la\u015ft\u0131rmalar\u0131na kadar <code>where()<\/code> metodunun \u00e7e\u015fitli kullan\u0131mlar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. Mant\u0131ksal grupland\u0131rma ve i\u00e7 i\u00e7e closure'lar arac\u0131l\u0131\u011f\u0131yla karma\u015f\u0131k <code>AND<\/code>\/<code>OR<\/code> yap\u0131lar\u0131n\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131, ili\u015fkisel sorgularda <code>whereHas()<\/code> ve <code>whereDoesntHave()<\/code> metotlar\u0131n\u0131 nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 ve \u00f6zel durumlarda <code>whereRaw()<\/code> ile ham SQL ifadelerine nas\u0131l ba\u015fvuraca\u011f\u0131m\u0131z\u0131 \u00f6\u011frendik.<\/p>\n<p>Ayr\u0131ca, sorgular\u0131 ay\u0131klamak i\u00e7in <code>toSql()<\/code>, <code>dd()<\/code> ve <code>DB::listen()<\/code> gibi ara\u00e7lar\u0131 tan\u0131tt\u0131k ve indeksleme, eager loading ve <code>select()<\/code> ile gereksiz s\u00fctunlardan ka\u00e7\u0131nma gibi \u00f6nemli performans optimizasyon tekniklerine de\u011findik. Son olarak, kod kalitesini, g\u00fcvenli\u011fi ve performans\u0131 art\u0131rmak i\u00e7in Eloquent metotlar\u0131n\u0131 tercih etme, kullan\u0131c\u0131 giri\u015flerini g\u00fcvenli hale getirme, s\u00fctunlar\u0131 indeksleme ve N+1 probleminden ka\u00e7\u0131nma gibi en iyi uygulamalar\u0131 \u00f6zetledik.<\/p>\n<p>Bu kapsaml\u0131 rehber, geli\u015ftiricilerin Laravel Eloquent ile veritaban\u0131 sorgular\u0131n\u0131 daha etkili, g\u00fcvenli ve performansl\u0131 bir \u015fekilde y\u00f6netmelerine yard\u0131mc\u0131 olmay\u0131 ama\u00e7lam\u0131\u015ft\u0131r. <code>where()<\/code> metodunun sundu\u011fu bu zengin yetenek setini ustal\u0131kla kullanarak, uygulamalar\u0131n\u0131z\u0131n veri katman\u0131n\u0131 optimize edebilir ve daha sa\u011flam, \u00f6l\u00e7eklenebilir \u00e7\u00f6z\u00fcmler geli\u015ftirebilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Laravel Eloquent&#8217;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nModern web uygulamalar\u0131n\u0131n bel kemi\u011fi","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":[133],"tags":[],"class_list":{"0":"post-33600","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","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>Laravel Eloquent&#039;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Laravel Eloquent&#039;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Laravel Eloquent&#039;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber Giri\u015f Modern web uygulamalar\u0131n\u0131n bel kemi\u011fi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-04T21:41:13+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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Laravel Eloquent&#8217;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-04T21:41:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\"},\"wordCount\":2670,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\",\"name\":\"Laravel Eloquent'ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-04T21:41:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel Eloquent&#8217;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir 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":"Laravel Eloquent'ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Laravel Eloquent'ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber","og_description":"Laravel Eloquent'ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber Giri\u015f Modern web uygulamalar\u0131n\u0131n bel kemi\u011fi","og_url":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-04T21:41:13+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Laravel Eloquent&#8217;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-04T21:41:13+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/"},"wordCount":2670,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/","name":"Laravel Eloquent'ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-04T21:41:13+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/laravel-eloquentta-where-metodu-ile-veritabani-sorgularini-iyilestirme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Laravel Eloquent&#8217;ta where() Metodu ile Veritaban\u0131 Sorgular\u0131n\u0131 \u0130yile\u015ftirme: Kapsaml\u0131 Bir 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\/33600","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=33600"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33600\/revisions"}],"predecessor-version":[{"id":33601,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33600\/revisions\/33601"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}