پایگاه داده: شروع به کار
معرفی
لاراول با استفاده از SQL خام، سازنده پرس و جو روان ، و Eloquent ORM ، تعامل با پایگاههای داده را در انواع پشتیبانهای پایگاه داده بسیار ساده میکند . در حال حاضر لاراول از چهار پایگاه داده پشتیبانی می کند:
- MySQL 5.6+ ( خط مشی نسخه )
- PostgreSQL 9.4+ ( خط مشی نسخه )
- SQLite 3.8.8+
- SQL Server 2017+ ( خط مشی نسخه )
پیکربندی
پیکربندی پایگاه داده برای برنامه شما در آدرس قرار دارد
config/database.php
.
در این فایل شما می توانید تمام اتصالات پایگاه داده خود را تعریف کنید و
همچنین مشخص کنید که کدام اتصال باید به طور پیش فرض استفاده شود.
نمونه هایی برای اکثر سیستم های پایگاه داده پشتیبانی شده در این فایل ارائه
شده است.
بهطور پیشفرض، پیکربندی محیط نمونه لاراول آماده استفاده با Laravel Homestead است ، که یک ماشین مجازی مناسب برای انجام توسعه لاراول در دستگاه محلی شما است. شما آزاد هستید که این پیکربندی را در صورت نیاز برای پایگاه داده محلی خود تغییر دهید.
پیکربندی SQLite
پس از ایجاد یک پایگاه داده جدید SQLite با استفاده از دستوری مانند
touch database/database.sqlite
، می توانید به راحتی متغیرهای محیط خود را برای اشاره به این پایگاه داده
جدید با استفاده از مسیر مطلق پایگاه داده پیکربندی کنید:
DB_CONNECTION=sqliteDB_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 کنترل می کند .