نسخه:

پایگاه داده: شروع به کار

معرفی

لاراول با استفاده از SQL خام، سازنده پرس و جو روان ، و Eloquent ORM ، تعامل با پایگاه‌های داده را در انواع پشتیبان‌های پایگاه داده بسیار ساده می‌کند . در حال حاضر لاراول از چهار پایگاه داده پشتیبانی می کند:

پیکربندی

پیکربندی پایگاه داده برای برنامه شما در آدرس قرار دارد config/database.php . در این فایل شما می توانید تمام اتصالات پایگاه داده خود را تعریف کنید و همچنین مشخص کنید که کدام اتصال باید به طور پیش فرض استفاده شود. نمونه هایی برای اکثر سیستم های پایگاه داده پشتیبانی شده در این فایل ارائه شده است.

به‌طور پیش‌فرض، پیکربندی محیط نمونه لاراول آماده استفاده با Laravel Homestead است ، که یک ماشین مجازی مناسب برای انجام توسعه لاراول در دستگاه محلی شما است. شما آزاد هستید که این پیکربندی را در صورت نیاز برای پایگاه داده محلی خود تغییر دهید.

پیکربندی SQLite

پس از ایجاد یک پایگاه داده جدید SQLite با استفاده از دستوری مانند touch database/database.sqlite ، می توانید به راحتی متغیرهای محیط خود را برای اشاره به این پایگاه داده جدید با استفاده از مسیر مطلق پایگاه داده پیکربندی کنید:

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

برای فعال کردن محدودیت‌های کلید خارجی برای اتصالات SQLite، باید DB_FOREIGN_KEYS متغیر محیطی را روی true :

DB_FOREIGN_KEYS=true

پیکربندی با استفاده از URL

به طور معمول، اتصالات پایگاه داده با استفاده از مقادیر پیکربندی چندگانه مانند،،،، و غیره پیکربندی می شوند. host هر یک از این مقادیر پیکربندی متغیر محیطی مربوط به خود را دارند. این بدان معناست که هنگام پیکربندی اطلاعات اتصال پایگاه داده خود بر روی یک سرور تولیدی، باید چندین متغیر محیطی را مدیریت کنید. database username password

برخی از ارائه دهندگان پایگاه داده مدیریت شده مانند Heroku یک پایگاه داده واحد "URL" را ارائه می دهند که شامل تمام اطلاعات اتصال برای پایگاه داده در یک رشته است. نمونه URL پایگاه داده ممکن است چیزی شبیه به زیر باشد:

mysql://root:password@127.0.0.1/forge?charset=UTF-8

این URL ها معمولاً از یک قرارداد استاندارد طرحواره پیروی می کنند:

driver://username:password@host:port/database?options

برای راحتی، لاراول از این URL ها به عنوان جایگزینی برای پیکربندی پایگاه داده شما با چندین گزینه پیکربندی پشتیبانی می کند. اگر گزینه پیکربندی url (یا DATABASE_URL متغیر محیط مربوطه) وجود داشته باشد، برای استخراج اتصال پایگاه داده و اطلاعات اعتبار استفاده می شود.

خواندن و نوشتن اتصالات

گاهی اوقات ممکن است بخواهید از یک اتصال پایگاه داده برای دستورات SELECT و دیگری برای INSERT، UPDATE و DELETE استفاده کنید. لاراول این کار را آسان می کند و اتصالات مناسب همیشه مورد استفاده قرار می گیرند، چه از پرس و جوهای خام، چه از سازنده پرس و جو یا از Eloquent ORM استفاده کنید.

برای اینکه ببینید چگونه اتصالات خواندن/نوشتن باید پیکربندی شوند، بیایید به این مثال نگاه کنیم:

'mysql' => [
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],

توجه داشته باشید که سه کلید به آرایه پیکربندی اضافه شده است : read و write . sticky کلیدهای read و write دارای مقادیر آرایه ای هستند که حاوی یک کلید واحد هستند: host . بقیه گزینه های پایگاه داده برای read و write اتصالات از آرایه اصلی ادغام خواهند شد mysql .

اگر می خواهید مقادیر آرایه اصلی را لغو کنید، فقط باید موارد را در آرایه read و قرار دهید. write بنابراین، در این مورد، 192.168.1.1 به عنوان میزبان برای اتصال "خواندن" استفاده می شود، در حالی که 192.168.1.3 برای اتصال "نوشتن" استفاده می شود. اعتبار پایگاه داده، پیشوند، مجموعه کاراکترها و همه گزینه های دیگر در mysql آرایه اصلی در هر دو اتصال به اشتراک گذاشته می شود.

گزینه sticky _

گزینه sticky یک مقدار اختیاری است که می تواند برای خواندن فوری رکوردهایی که در چرخه درخواست فعلی در پایگاه داده نوشته شده اند استفاده شود. اگر این sticky گزینه فعال باشد و عملیات "نوشتن" در برابر پایگاه داده در طول چرخه درخواست فعلی انجام شده باشد، هر عملیات "خواندن" بعدی از اتصال "نوشتن" استفاده خواهد کرد. این تضمین می کند که هر داده ای که در طول چرخه درخواست نوشته می شود را می توان بلافاصله در همان درخواست از پایگاه داده بازخوانی کرد. این شما هستید که باید تصمیم بگیرید که آیا این رفتار مطلوب برای برنامه شما است یا خیر.

استفاده از اتصالات چندگانه پایگاه داده

هنگام استفاده از چندین اتصال، می توانید از طریق connection روش روی DB نما به هر اتصال دسترسی داشته باشید. متد name ارسال شده connection باید با یکی از اتصالات لیست شده در config/database.php فایل پیکربندی شما مطابقت داشته باشد:

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

getPdo همچنین می‌توانید با استفاده از روش موجود در یک نمونه اتصال، به نمونه خام و زیربنایی PDO دسترسی پیدا کنید :

$pdo = DB::connection()->getPdo();

اجرای پرس و جوهای SQL خام

هنگامی که اتصال پایگاه داده خود را پیکربندی کردید، می توانید پرس و جوهایی را با استفاده از DB نما اجرا کنید. نما DB روش هایی را برای هر نوع پرس و جو ارائه می دهد: select , update , insert , delete و statement .

اجرای یک کوئری انتخابی

برای اجرای یک پرس و جو اولیه، می توانید از select روش روی DB نما استفاده کنید:

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
 
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
 
return view('user.index', ['users' => $users]);
}
}

اولین آرگومان ارسال شده به select متد، پرس و جوی خام SQL است، در حالی که آرگومان دوم هر گونه پیوند پارامتری است که باید به پرس و جو متصل شود. به طور معمول، این مقادیر where محدودیت های عبارت هستند. اتصال پارامتر محافظت در برابر تزریق SQL را فراهم می کند.

این select روش همیشه یک array نتیجه را برمی گرداند. هر نتیجه در آرایه یک شی PHP خواهد بود stdClass که به شما امکان می دهد به مقادیر نتایج دسترسی پیدا کنید:

foreach ($users as $user) {
echo $user->name;
}

استفاده از Bindings با نام

به جای استفاده ? برای نمایش پیوندهای پارامتری خود، می توانید یک پرس و جو را با استفاده از اتصالات نامگذاری شده اجرا کنید:

$results = DB::select('select * from users where id = :id', ['id' => 1]);

اجرای یک بیانیه درج

برای اجرای یک insert دستور، می توانید از insert روش روی DB نما استفاده کنید. مانند select ، این متد پرس و جوی خام SQL را به عنوان آرگومان اول و bindings را به عنوان آرگومان دوم خود می گیرد:

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

اجرای بیانیه به روز رسانی

این update روش باید برای به روز رسانی رکوردهای موجود در پایگاه داده استفاده شود. تعداد ردیف‌هایی که تحت تأثیر دستور قرار می‌گیرند برگردانده می‌شوند:

$affected = DB::update('update users set votes = 100 where name = ?', ['John']);

اجرای یک بیانیه حذف

این delete روش باید برای حذف رکوردها از پایگاه داده استفاده شود. مانند update ، تعداد ردیف های تحت تأثیر برگردانده می شود:

$deleted = DB::delete('delete from users');

اجرای یک بیانیه عمومی

برخی از دستورات پایگاه داده هیچ مقداری را بر نمی گرداند. برای این نوع عملیات، می توانید از statement روش زیر در DB نما استفاده کنید:

DB::statement('drop table users');

گوش دادن به رویدادهای پرس و جو

اگر مایلید هر کوئری SQL که توسط برنامه شما اجرا می شود را دریافت کنید، می توانید از این listen روش استفاده کنید. این روش برای ثبت پرس و جوها یا اشکال زدایی مفید است. می توانید شنونده درخواست خود را در یک ارائه دهنده خدمات ثبت کنید :

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
 
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
}

معاملات پایگاه داده

می توانید از transaction روش روی DB نما برای اجرای مجموعه ای از عملیات در یک تراکنش پایگاه داده استفاده کنید. اگر یک استثنا در تراکنش ایجاد شود Closure ، تراکنش به طور خودکار برگشت داده می شود. در صورت Closure موفقیت آمیز بودن تراکنش، تراکنش به طور خودکار انجام می شود. در حین استفاده از روش، نیازی نیست نگران عقب نشینی یا تعهد به صورت دستی باشید transaction :

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

رسیدگی به بن بست ها

این transaction روش یک آرگومان دوم اختیاری را می پذیرد که تعداد دفعاتی را که یک تراکنش باید در زمان وقوع بن بست انجام شود را مشخص می کند. هنگامی که این تلاش ها تمام شد، یک استثنا ایجاد می شود:

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

استفاده دستی از تراکنش ها

اگر می خواهید یک تراکنش را به صورت دستی شروع کنید و کنترل کاملی بر بازگشت و تعهد داشته باشید، می توانید از beginTransaction روش زیر در DB نما استفاده کنید:

DB::beginTransaction();

می توانید تراکنش را از طریق rollBack روش زیر برگردانید:

DB::rollBack();

در نهایت، می توانید یک تراکنش را از طریق commit روش زیر انجام دهید:

DB::commit();

روش های تراکنش نما DB ، تراکنش ها را هم برای سازنده پرس و جو و هم برای ORM Eloquent کنترل می کند .