آموزش مقدماتی لاراول – اتصال به دیتابیس و کار با sqlite

یکی از قسمت‌های مهم یک سایت توانایی ذخیره کردن و کار با دیتاست و معمولا سایت‌ها اینکار را از طریق دیتابیس یا پایگاه داده انجام میدن. در این مقاله در مورد نحوه اتصال لاراول به دیتابیس sqlite صحبت خواهیم کرد و اینکه چطور یک مدل برای ذخیره کردن اطلاعات در دیتابیس ایجاد کنیم.


به طور معمول فریم‌ورکهای مختلف امکان اتصال به دیتابیس‌های مختلف رو فراهم می‌کنند. در لاراول هم همینطوره و شما میتونید پایگاه‌ داده‌های مختلفی رو به پروژتون متصل کنید. برای نمونه ممکنه در محصول نهاییتون بخوایید mysql رو استفاده کنید و موقعی هم که دارید در سیستم خودتون توسعه میدید از sqlite یا postgres و یا هر نوع دیگری رو استفاده کنید! در این آموزش ما نحوه اتصال به SQlite رو خواهیم گفت که در واقع یه دیتابیس سبک و از نوع فایل رو برای شما فراهم میکنه و کار کردن با اون بسیار سادست و تنظیم کردن اون مثه آب خوردنه! 

خوب برای شروع ابتدا فایلی به نام .env که در دایرکتوری اصلی پروژه هست رو باز کنید. این فایل اطلاعات مهمی از قبیل کانال اتصال به سرویس ایمیل، دیتابیس و هر دیتای حیاتی و مهمی که محرمانه هم هستند رو داخلش نگه میداره. یکی از دلایلی هم که داخل gitignore قرار می‌گیره همین محرمانه بودن اطلاعاتشه! همانطور که به پارامترهایی که در این فایل تعریف شدند بصورت پیش‌فرض اتصال به دیتابیس از نوع mysql تعریف شده من اون رو بصورت زیر به sqlite تعریف میکنم و باقی قسمت‌ها رو هم پاک می‌کنم:

DB_CONNECTION=sqlite

خب قدم بعدی اینه که یک فایل sqlite داخل پروژهمون برای ذخیره اطلاعات روی اون ایجاد کنیم من داخل فولدر database در دایرکتوری اصلی پروژه اینکار رو انجام دادم:

touch database/database.sqlite

به همین راحتی پایگاه داده sqlite رو پروژه لاراولمون متصل کردیم!

در ادامه میخوام یک مفهوم جدید در لاراول به نام migration رو معرفی کنم. این مفهوم به منظور مدیریت جداول در دیتابیس طراحی شده. داخل هر فایل migration شما می‌تونید یک جدول ایجاد کنید، در یک جدول یک ستون کم و یا زیاد کنید و هر تغییر دیگری که مدنظرتونه! البته امکان بازگشتن rollback وجود داره ولی اساسا فرایند migration یک فرایند رو به جلو هست چرا که شما نمیتونید توی محصول نهایی که دیتا داخل دیتابیس هست رول‌بک کنید. اینکار داخل محیط توسعه ایرادی نداره و شاید لازم باشه انجامش بدید ولی  به پیشنهاد من سعی کنید اول دیتابیس و جداولی که میخواید رو طراحی کنید و بعد شروع به ایجاد migration بکنید هرجا هم لازم به تغییر بود بجای بازگشت یا رول‌بک یک migration جدید برای تغییراتتون ایجاد کنید. این نکته بسیار مهمه!

Image for post
Image for post

خب همینطور که در تصویر بالا هم مشخصه تعدادی فایل از پیش داخل مسیر migration ها وجود دارد! فعلا با اینا کار نداریم میتونیم بعدا با ی migration دیگه اگر خواستیم میتونیم اونارو پاک یا هر تغییری خواستیم رو اعمال کنم.

مهم:  من یه تغییراتی در پروژه فعلی انجام دادم که خروجی پروژه رو کمی جذاب‌تر کنیم. تصمیم گرفتم خروجی یک وب‌سایت موسیقی باشه که ادمین بتونه در اون اطلاعات یک موسیقی رو بارگذاری کنه و در طول این آموزش این محصول رو تکمیل کنیم و نکاتی هم که لازمه رو به مرور آموزش بدم!

Image for post
Image for post

برای ساخت یه فایل migration از دستور زیر استفاده می‌کنیم:

Php artisan make:migration <name_of_migration>

پس از این دستور یک فایل با نامی که تعریف کردیم در مسیر database/migrations ایجاد میشه و نهایتا با اجرای دستور migrate جداولی که در این فایل تعریف شدند ایجاد خواهند شد:

Image for post
Image for post

اگر مثل من به همچین خطایی برخوردید بخاطر نصب نبودن sqlite روی سیستم شماست. پس از نصب خروجی شما مثل زیر خواهد بود:

Image for post
Image for post

خب حالا کاری که میخوایم انجام بدیم اینه که در صفحه لیست آهنگها اطلاعات هر آهنگ از دیتابیس آورده بشه! برای اینکار به چیزی به نام مدل نیاز داریم. یک مدل نشون دهنده یک ردیف در جدول دیتابیس هست. این مدل‌ها در لاراول از یک کلاس مادر بنام eloquent ساخته می‌شوند که قابلیت‌هایی نظیر ذخیره کردن یک رکورد جدید در دیتابیس، ویرایش و حتی پاک کردن رو برای ما فراهم می‌کنه. 

خب حالا بیایید یک مدل برای آهنگامون ایجاد کنیم. بار دیگر به دستور artisan  برمی‌گردیم:

php artisan help make:model

اگه دستور فوق رو داخل ترمینالتون وارد کنید میبینید که قابلیت‌های کاربردی در این دستور هست مثه –m که باعث میشه یک فایل migration برای این مدل همزمان ایجاد بشه یا –c که این هم برای ساخت همزمان کنترلر برای این مدل هست. ما در اینجا هم به کنترلر و هم migration نیاز داریم. پس دستوری که باید وارد کنیم بصورت زیر خواهد بود:

php artisan make:model Song -mc
Image for post
Image for post

دیتابیس که اطلاعات هر آهنگ رو ذخیره می‌شه و یک کنترلر برای پردازش داده‌ ایجاد کرده. حالا باید به فایل migration آهنگامون برگردیم جایی که قراره جدول آهنگامون در دیتابیس رو توصیف کنیم.

در این کلاس به طور کلی دوتا تابع up و down رو مشاهده می‌کنیم. تابع up برای اجرای migration و تابع down برای عملیات بازگشت یا همون رول‌بک استفاده میشه! و همه اینها به لطف یه بیلدر به نام schema که توصیف ما رو به بعنوان یه نقشه یا طرح میگیره و به زیان اون سرویس دیتابیسی که داریم از اون استفاده می‌کنیم ترجمه می‌کنه! که این نقشه هم در قالب یه کلاس به نام Blueprint انجام میشه. 

نگران این مفاهیم نباشید تنها چیزی که اینجا به اون نیاز داریم یکسری تابع از پیش تعریف شدست که به مرور باهاشون آشنا میشیم!

من در اینجا برای سادگی بیشتر تنها ویژگی اسم رو به جدول songs اضافه کردم:

public function up()
{
   Schema::create('songs', function (Blueprint $table) {
       $table->bigIncrements('id');
       $table->string('name');
       $table->timestamps();
   });
}

حالا با دستور زیر جدول ما در دیتابیس ساخته میشه و کار تمومه!

حالا اگر میخوایید دیتابیسی که ساختید رو ببینید و مثه من از ادیتور idea استفاده می‌کنید کافیه که فایل دیتابیس رو باز کنید و اگر خواست درایور مورد نیازش رو نصب کنید! همچنین می‌تونید از اپ‌های دیگر هم استفاده کنید یکی از این نرم‌افزارها sqlitebrowser هست.

Image for post
Image for post

اینجا فقط جدول songs رو ما ساختیم باقی جداول بصورت پیشفرض داخل هر پروژه لاراول وجود دارد و ممکنه با نصب یک پکیج هم جدول‌های مورد نیاز اون پکیج هم نصب بشه!

خیلی خوب تبریک میگم شما یکی از مهمترین قسمت‌ها در لاراول رو انجام دادید:‌ اتصال به دیتابیس،  ساخت یک جدول و مدلی که به اون متصله…

حالا میخوایم صرفا برای تست تعدادی دیتا درون جدولی که ساختیم تولید کنیم. یه روش جذاب استفاده از tinker هست. tinker یجور محیط زنده برای اجرای دستورات php هست و برای اینکه از اون بخوایم استفاده کنیم کافیه دستور زیر رو اجرا کنیم:

php artisan tinker

اجازه بدید اولین تابع از مدل‌های eloquent رو مشاهده کنیم:

>> Song::all();
=> Illuminate\Database\Eloquent\Collection {#4240
     all: [],
   }

تابع all تمامی رکوردهای جدول رو برای ما نمایش میده و چون ما در اینجا هیچ دیتای از قبل نداشتیم خروجی نداریم. در ادامه من یک رکورد رو ذخیره میکنم برای این کار هم یک شی از کلاس song میسازیم و با مقداری دهی ویژگی نام که قبلا در این مدل تعریف کردیم و نهایتا فراخوانی تابع save رکورد رو در جدول ذخیره می‌کنیم:

>>> $song = new Song();
=> App\Models\Song {#4329}
>>> $song->name = "Zakhme kari";
=> "Zakhme kari"
>>> $song->save();
=> true

حال مجددا دستور قبلی رو اجرا می‌کنیم و خواهید دید که این بار جدول ما خالی نیست:

>>> Song::all();
=> Illuminate\Database\Eloquent\Collection {#4135
     all: [
       App\Models\Song {#3767
         id: "1",
         name: "Zakhme kari",
         created_at: "2021-11-17 13:39:35",
         updated_at: "2021-11-17 13:39:35",
       },
     ],
   }

حالا بیایید برگردیم سر وقت کنترلری که ساختیم. مانند همون تابع list که در آموزش قبلی ساختیم یک تابع تعریف می‌کنیم با این تفاوت که اینبار دیتا از دیتابیس گرفته خواهد شد:

public function list()
{
   $songs = Song::all();
   return view('internal.songs', [
       'songs' => $songs
   ]);
}

اگر همه چیز درست پیش رفته باشد خروجی شما بصورت زیر است.

Image for post
Image for post

برای اینکه تنها نام آهنگ نمایش داده شود کافیست ویژگی name را در فایل blade مربوطه صدا بزنید:

Image for post
Image for post

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