Laravel Veritabanı İşlemleri

Laravel Veritabanı İşlemleri

329 Okunma Laravel Emir Gökkaya

Laravel Database

Laravel, hem SQL sorgu oluşturucu, hem de Eloquent ORM kullanarak, veritabanları ile etkileşime geçmeyi son derece basit hale getiriyor.

Laravel uygulamalarında kullanabileceğimiz dört çeşit veritabanı vardır;

  • MySQL 5.6+
  • PostgreSQL 9.4+
  • SQLite 3.8.8+
  • SQL Server 2017+

Database Yapılandırma Ayarları

Yapılandırma ayarları uygulamamızın config/database.php dosyasında bulunmaktadır. Bu dosyada veritabanı bağlantılarımızı tanımlayabiliriz, varsayılan olarak hangi bağlantının kullanılması gerektiğini de belitebiliriz.

Desteklenen veritabanı sistemleri için örnekler dosyada mevcuttur.

Local alanda geliştirme yapmak için, Laravel sanal makinesi olan Homestead, varsayılan olarak kullanıma hazırdır. Tabi bu ayarları kendimize göre daha sonra özelleştirebiliriz.

SQLite Yapılandırma Ayarları

database dizini altında yeni bir dosya oluşturalım ya da terminalden touch database/database.sqlite, komutunu girelim. Daha sonra veritabanının mutlak yolunu kullanarak yeni oluşturulan bu veritabanına işaret edecek şekilde ayarlayalım;

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

URL ile Yapılandırma

Genellikle veritabanı bağlantılarında, hostdatabaseusernamepassword, vb. gibi çoklu yapılandırma değerleri kullanılır. Bu konfigrasyon değerlerinin her biri kendine karşılık gelen ortam değişkenine sahiptir. Bu, bir sunucuda veritabanı bağlantı bilgilerini yapılandırırken, çeşitli ortam değişkenlerini yönetmemiz gerektiği anlamına gelir.

Bazı yönetilen veritabanı sağlayıcıları, veritabanına ilişkin tüm bağlantı bilgilerini tek bir dizede içeren tek bir veritabanı URL i ile sağlar. Örneğin;

mysql://root:[email protected]/forge?charset=UTF-8
driver://username:[email protected]:port/database?options

Çoklu Veritabanı Bağlantısı Kurma

config/database.php dosyasına yeni bağlantı ayarlarını ekleyerek uygulamamıza çoklu veritabanı sağlantısı sağlayabliriz.

'connections' => array(
# Varsayılan veritabanı bağlantısı
'mysql' => array(
'driver' => 'mysql',
'host' => 'host1',
'database' => 'database1',
'username' => 'user1',
'password' => 'pass1'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
# İkinci veritabanı bağlantısı
'mysql2' => array(
'driver' => 'mysql',
'host' => 'host2',
'database' => 'database2',
'username' => 'user2',
'password' => 'pass2'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),

 

Peki hangi veritabanına nasıl bağlanacağız ?

Bağlanacağımız veritabanını belirtmek için bağlantı adımızı kullanmamız gereklidir. Örneğin bir migrate dosyası oluşturalım;

php artisan make:migration create_users_table

Migrate dosyamıza gidelim database/migrations/..._create_users_table.php.

Şimdi tablomuzun özelliklerini vereceğiz, fakat mysql2 veritabanımıza bu tabloyu ekleyeceğiz;

Schema::connection('mysql2')->create('some_table',
function($table){
$table->increments('id');
$table->string('name');
$table->string('username');
});

mysql2 veritabanına tablomuz eklendi. Şimdi bu tablodan sorgu ile veri çekelim;

$users = DB::connection('mysql2')->select('...');

Yukarıda Query ile sorgumuzu yaptık. İstersek Eloquentle modellerinde de hangi bağlantının kullanılacağını tanımlayabiliriz. Bunun bir yolu modelimizde $connection değişkenini ayarlamaktır;

class User extends Eloquent
{
protected $connection = 'mysql2';
}

Bağlantıyı çalışma zamanında setConnection metodunu kullanarak da tanımlayabiliriz;

class UserController extends BaseController
{
public function someMethod()
{
$users = new User;
$users->setConnection('mysql2');
$users = $users->find(1);

return $users;
}
}

Veritabanları arasında tablolarla ilişkiler kurmaya çalışırken dikkatli olmalıyız, çünkü böyle bağlantılar veritabanlarımızın ayarlarına bağlıdır.

Sorgu Olaylarını Dinleme(listening for query events)

Uygulamamız tarafından yürütülen her SQL sorgusunu almak istersek, listen yöntemini kullanabiliriz. Bu yöntem, günlük sorgu veya hata ayıklama için kullanışlıdır. Sorgu dinleyicilerimizi bir servis sağlayıcıya kaydedebiliriz(AppServiceProvider);

class AppServiceProvider extends ServiceProvider{

public function register(){
//
}

public function boot(){
DB::listen(function ($query) {

// $query->sql
// $query->bindings
// $query->time

});
}
}

Database Transactions

veritabanımızda bir dizi işlem çalıştırmak için transaction metodu kullanabiliriz. Closure sırasında bir exception(istisna) atılırsa, işlem otomatik olarak geri alınır. Closure başarılı bir şekilde yürütülürse, işlem otomatik olarak yapılır;

DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});

Handling Deadlocks

transaction metodu, bir deadlock  meydana geldiğinde işlemin yeniden denenmesi gerektiğini tanımlayan isteğe bağlı ikinci bir argümanı kabul eder. Bu işlemler tamamlandığında bir exception atılacaktır;

DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);

Manually Using Transactions(İşlemleri Manuel Kullanma)

Bir transaction ı manuel başlatmak ve geri almak istiyorsak, beginTransaction metodu kullanmalıyız;

DB::beginTransaction();

İşlemi rollback metodu ile geri alabiliriz;

DB::rollBack();

commit metodu ile işlemi yapabiliriz;

DB::commit();

Daha fazla bilgi için Laravel'in web sitesine buradan gidebilirsiniz.

Referanslarımızı incelemek ister misiniz?
Bitirmekten keyif aldığımız ve yeni tecrübeler kazandığımız projelerimiz.