fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

| AmirHossein |

| AmirHossein |

رفتن به کانال در Telegram

پنوشته‌های یک برنامه‌نویس ناشی 🫂 @StartBevy

نمایش بیشتر
610
مشترکین
اطلاعاتی وجود ندارد24 ساعت
+27 روز
+230 روز
آرشیو پست ها
Repost from | Erfan's Notes |
⭕️ دوره آموزش برنامه‌نویسی مینی اپ تلگرام 💠 در این دوره به آموزش برنامه‌نویسی مینی اپ تلگرام می‌پردازیم، از مباحث پایه و عمو
⭕️ دوره آموزش برنامه‌نویسی مینی اپ تلگرام 💠 در این دوره به آموزش برنامه‌نویسی مینی اپ تلگرام می‌پردازیم، از مباحث پایه و عمومی شروع می‌کنیم و مفاهیم رو یاد می‌گیریم.

sticker.webp0.09 KB

Repost from Mahi in Tech
وقتی روی ریپوی پابلیک اشتباهی secret key پوش کردی
وقتی روی ریپوی پابلیک اشتباهی secret key پوش کردی

فصل پنج - Migrations and Database بخش دوم - Factories لاراول هنگام کار با فکتوری‌ها، مجموعه‌ای از متدها و پراپرتی‌ها را ارائه می‌دهد که به شما کمک می‌کنند داده‌های نمونه پیشرفته‌تری بسازید. این متد ها درون کلاس فکتوری پیاده سازی می شوند. 1- متد definition این متد اصلی ترین متد برای تعریف داده‌های پیش‌فرض فکتوری استفاده می‌شود. داده‌های تولید شده توسط Faker در این متد تعریف می‌شوند. این متد یک آرایه برمی گرداند که شامل نام فیلد ها به عنوان key و مقدار فیلد ها به عنوان value می باشد.
class UserFactory extends Factory
{
 protected $model = \App\Models\User::class;

 public function definition()
 {
  return [
   'name' => $this->faker->name(),
   'email' => $this->faker->unique()->safeEmail(),
   'password' => bcrypt('password'),
  ];
 }
}
2- متد unverified این متد می‌تواند حالتی خاص برای فکتوری شما تعریف کند. مثلاً داده‌هایی را تولید کند که ایمیل کاربر تایید نشده باشد. وقتی شما از متد unverified استفاده می‌کنید، در واقع یک وضعیت خاص برای فیلدها تعریف می‌کنید که باعث می‌شود برخی از فیلدها مانند email_verified_at برای رکوردهای ساخته شده، مقدار null داشته باشند.
public function unverified()
{
 return $this->state(function (array $attributes) {
  return [
   'email_verified_at' => null,
  ];
 });
}

// Usage:
User::factory()->unverified()->create();
این متد یک state جدید ایجاد می کند، یعنی می توانید برخی از مقادیر فیلدها را در unverified تغییر دهید بدون این که کل تعریف پیش‌فرض در متد definition را تغییر دهید. 3- متد suspended یک حالت خاص دیگر (مانند unverified) برای داده‌ها تعریف می‌کند. این متد معمولاً برای افزودن وضعیت خاص به رکوردها استفاده می‌شود.
public function suspended()
{
 return $this->state(function (array $attributes) {
  return [
   'is_suspended' => true,
  ];
 });
}

// Usage:
User::factory()->suspended()->create();
4- متد configure متدی که به شما اجازه می‌دهد عملیات سفارشی‌سازی یا رویدادهایی را قبل یا بعد از ایجاد رکوردها اجرا کنید. معمولاً برای تنظیم مقادیر اضافی یا اعمال تغییرات خاص استفاده می‌شود.
public function configure()
{
 return $this->afterCreating(function (User $user) {
  $user->profile()->create([
   'bio' => 'This is a sample bio.',
  ]);
 });
}

// Usage:
User::factory()->create();
این متد پس از اجرای متد craete به طور خودکار ایجاد می شود. همچنین می توانید به جای afterCreating از afterMaking استفاده کنید درصورت استفاده از متد make. 5- متد newFactory برای اتصال یک مدل به فکتوری استفاده می‌شود. این متد معمولاً در مدل‌ها تعریف می‌شود و هدف اصلی آن مشخص کردن فکتوری مرتبط با مدل است تا بتوان به سادگی و بدون نیاز به تنظیم دستی، رکوردهای مدل را با استفاده از فکتوری تولید کرد.
class User extends Authenticatable
{
 use HasFactory;

 protected static function newFactory()
 {
  return UserFactory::new(); 
 }
}
درصورتی که نام مدل و فکتوری شما استاندارد باشد (مثلا User و UserFactory به ترتیب برای مدل و فکتوری)، لاراول به طور خودکار این عملیات را انجام می دهد. در قسمت بعدی با تمامی متد های مرتبط با فکتوری که از مدل ها قابل فراخوانی هستند آشنا می شویم. #laravel #لاراول #فصل_۵ @AmirhDeveloper .

فصل پنج - Migrations and Database بخش دوم - Factories فکتوری‌ها در لاراول ابزاری برای ایجاد سریع و راحت داده‌های نمونه (mock) برای تست و توسعه هستند. با استفاده از فکتوری‌ها، می‌توانید به راحتی رکوردهایی را در پایگاه داده تولید کنید، بدون اینکه نیاز باشد به صورت دستی داده‌ها را وارد کنید. در تست‌های خودکار، می‌توانید با استفاده از فکتوری‌ها داده‌های نمونه ایجاد کنید تا رفتار اپلیکیشن خود را آزمایش کنید. ساخت یک فکتوری: برای ساخت فکتوری، می توانید از دستور زیر استفاده کنید:
php artisan make:factory UserFactory
این دستور یک فکتوری با نام UserFactory برای شما در مسیر database/factories ایجاد می کند. در فایل فکتوری که ایجاد شده، می‌توانید داده‌های پیش‌فرض را تعریف کنید. مثال: تعریف یک فکتوری برای مدل User:
class UserFactory extends Factory
{
 protected $model = \App\Models\User::class;

 public function definition()
 {
  return [
   'name' => $this->faker->name(),
   'email' => $this->faker->unique()->safeEmail(),
   'email_verified_at' => now(),
   'password' => bcrypt('password'),
   'remember_token' => Str::random(10),
  ];
 }
}
هر فیلد جدول، مقدار پیش‌فرضی در اینجا دارد که به صورت خودکار تولید می‌شود. استفاده از فکتوری: برای تولید یک رکورد در پایگاه داده:
User::factory()->create();
این کد یک رکورد تست برای شما ایجاد می کند. برای تولید چندین رکورد:
User::factory()->count(10)->create();
این کد به تعداد مشخص شده، رکورد تست برای شما ایجاد می کند. برای ایجاد یک رکورد ولی بدون ذخیره کردن آن:
$user = User::factory()->make();
این کد یک رکورد تست برای شما ایجاد می کند اما در دیتابیس ذخیره نمی کند. مثال کامل: فرض کنید یک جدول برای مقالات (Posts) دارید.
class PostFactory extends Factory
{
 protected $model = \App\Models\Post::class;

 public function definition()
 {
  return [
   'title' => $this->faker->sentence(),
   'content' => $this->faker->paragraph(),
   'user_id' => \App\Models\User::factory(),
  ];
 }
}
این کد یک جمله رندوم برای title، یک پاراگراف رندوم برای content، و یک کاربر جدید برای user_id ایجاد می کند. فرض کنید می خواهیم 100 پست تستی ایجاد کنیم:
Post::factory()->count(100)->create();
این فکتوری به سادگی 100 پست تستی برای شما ایجاد خواهد کرد. فکتوری‌ها ابزاری قدرتمند برای تولید داده‌های تستی و توسعه هستند. به کمک آن‌ها می‌توانید به‌سرعت داده‌های مرتبط ایجاد کرده و تست‌های خود را ساده‌تر و سریع‌تر انجام دهید. فکتوری‌ها انعطاف‌پذیر هستند و می‌توانید شرایط مختلف (مانند ایجاد رکوردهای مرتبط) را پیاده‌سازی کنید. در پست های بعدی به طور کامل به فکتوری ها خواهیم پرداخت. #laravel #لاراول #فصل_۵ @AmirhDeveloper .

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها در قسمت آخر این بخش به تمامی کامندهای مربوط به مایگریشن ها اشاره می شود. 1- کامند make:migration این دستور برای ایجاد یک فایل Migration جدید استفاده می‌شود.
php artisan make:migration create_flights_table
این کامند می تواند دو فلگ —create برای مایگریشن مربوط به ساخت جدول و —table برای مایگریشن های مربوط به ویرایش جدول را نیز دریافت کند.
php artisan make:migration create_flights_table
 --create=flights

php artisan make:migration create_flights_table
 --table=flights
2- کامند schema:dump این دستور یک نسخه SQL dump از طرح پایگاه داده (schema) فعلی شما ایجاد می‌کند. این فایل در مسیر database/schema ذخیره می‌شود.
php artisan schema:dump
این متد نیز تعدادی فلگ دریافت میکند که در ادامه توضیح داده می شود: - فلگ prune فایل‌های مهاجرت قدیمی (migration) را حذف می‌کند و تنها یک نسخه dump ایجاد می‌کند.
php artisan schema:dump --prune
- فلگ database این دستور نسخه SQL از طرح پایگاه داده را برای پایگاه داده مشخص‌شده ایجاد می‌کند.
php artisan schema:dump --database=testing
همچنین می توانید هر دو فلگ را همزمان استفاده کنید. 3- کامند migrate این دستور تمامی فایل‌های مهاجرت را که تاکنون اجرا نشده‌اند، اجرا می‌کند و پایگاه داده را به‌روز می‌کند.
php artisan migrate
این کامند نیز تعدادی فلگ دریافت میکند: - فلگ pretend این دستور تغییرات مهاجرت را بدون اعمال واقعی، شبیه‌سازی می‌کند. می‌توانید ببینید چه کوئری‌هایی قرار است اجرا شوند. - فلگ isolated این دستور مهاجرت‌ها را در یک حالت ایزوله‌شده (isolated) اجرا می‌کند. این حالت معمولاً برای جلوگیری از تداخل مهاجرت‌ها در اجراهای هم‌زمان استفاده می‌شود.
php artisan migrate --isolated
- فلگ force این دستور برای اجرای مهاجرت‌ها در حالت Production (محیط عملیاتی) استفاده می‌شود. به‌طور پیش‌فرض، مهاجرت‌ها در Production متوقف می‌شوند، اما با --force اجرا خواهند شد. 4- کامند migrate:status این دستور وضعیت مهاجرت‌ها را نشان می‌دهد. مشخص می‌کند که کدام فایل‌های مهاجرت اجرا شده‌اند و کدام هنوز اجرا نشده‌اند.
php artisan migrate:status
5- کامند migrate:rollback این دستور آخرین گروه از مهاجرت‌ها (آخرین batch) را برمی‌گرداند. این کامند نیز تعدادی فلگ دریافت می کند که در ادامه بررسی می شود: - فلگ step این دستور x مرحله از آخرین مهاجرت‌ها را برمی‌گرداند.
php artisan migrate:rollback --step=5
- فلگ batch این دستور مهاجرت‌های batch شماره ۳ را برمی‌گرداند. مهاجرت‌ها در اجرای هر بار migrate در یک batch مشخص ذخیره می‌شوند.
php artisan migrate:rollback --batch=3
- فلگ pretend این دستور مهاجرت‌ها را برنمی‌گرداند، اما تغییرات آن را شبیه‌سازی کرده و کوئری‌های مربوطه را نمایش می‌دهد.
php artisan migrate:rollback --pretend
6- کامند migrate:reset این دستور همه مهاجرت‌ها را به حالت اول برمی‌گرداند. تمامی جداول و تغییرات اعمال‌شده حذف می‌شوند.
php artisan migrate:reset
7- کامند migrate:refresh این دستور ابتدا تمامی مهاجرت‌ها را برمی‌گرداند (reset می‌کند) و سپس آن‌ها را دوباره اجرا می‌کند.
php artisan migrate:refresh
این متد نیز فلگ هایی دریافت می کند: - فلگ seed این دستور همانند دستور قبل عمل می‌کند، اما علاوه بر آن، seederها را نیز اجرا می‌کند تا داده‌های اولیه وارد پایگاه داده شوند. (سیدر ها در بخش بعدی توضیح داده می شود)
php artisan migrate:refresh --seed
- فلگ step این دستور x مرحله آخر مهاجرت‌ها را برمی‌گرداند و دوباره اجرا می‌کند.
php artisan migrate:refresh --step=5
8- کامند migrate:fresh این دستور تمام جداول پایگاه داده را به‌طور کامل حذف می‌کند و سپس مهاجرت‌ها را دوباره اجرا می‌کند.
php artisan migrate:fresh
این متد هم فلگ هایی را دریافت می کند: - فلگ seed این دستور همانند migrate:fresh عمل می‌کند، اما پس از اجرای مهاجرت‌ها، seederها را نیز اجرا می‌کند.
php artisan migrate:fresh --seed
- فلگ database این دستور نسخه پایگاه داده خاص را از ابتدا می‌سازد.
php artisan migrate:fresh --database=admin
#laravel #لاراول #فصل_۵ @AmirhDeveloper .

Repost from Mahi in Tech
همونطور که می‌دونید، شما برای توسعه‌ی یک Mini App تلگرامی نیاز دارید که وب‌اپلیکیشن‌تون به‌صورت HTTPS در دسترس باشه که خب توس
+1
همونطور که می‌دونید، شما برای توسعه‌ی یک Mini App تلگرامی نیاز دارید که وب‌اپلیکیشن‌تون به‌صورت HTTPS در دسترس باشه که خب توسعه‌ی لوکال رو سخت می‌کنه و به ابزارهایی مثل ngrok برای تونل کردن لوکال‌هاستتون نیاز پیدا می‌کنید، همچنین دیدن حالت‌های مختلف (تم‌ و سیستم‌عامل‌های مختلف مثلا) به‌سادگی همیشه نیست و احتمالا باید چند موبایل دم‌دستتون باشه تا بتونید خروجی کار رو به‌خوبی ببینید :)) این محیط، یعنی 📱 TMA Studio، رو یکی از دوستان به‌تازگی منتشر کرده اکثر این مشکلات رو حل کرده و با شبیه‌سازی محیط مینی‌اپ‌های تلگرام، توسعه‌ی اون‌ها رو ساده‌تر کرده و به‌صورت کراس‌پلتفرم دردسترس هست که خب می‌تونید ازش استفاده کنید و یا درتوسعه‌ش مشارکت داشته باشید. برای حمایت از این پروژه می‌تونید توی گیت‌هاب بهش ⭐️ بدید. 📱 Repo Link 🌐 tma-studio.pages.dev

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها 1- متد unique این متد یک ایندکس یکتا برای یک یا چند ستون تعریف می‌کند. ایندکس یکتا باعث می‌شود که مقدارهای تکراری برای این ستون‌ها در جدول ذخیره نشود.
$table->string('email')->unique();
2- متد index این متد یک ایندکس ساده برای یک یا چند ستون ایجاد می‌کند. این ایندکس برای بهبود عملکرد کوئری‌هایی استفاده می‌شود که مرتباً این ستون‌ها را جستجو یا فیلتر می‌کنند.
$table->string('username')->index();
3- متد primary این متد یک کلید اصلی (Primary Key) برای یک یا چند ستون تعریف می‌کند. ستون‌های کلید اصلی نمی‌توانند مقدار NULL بپذیرند و باید یکتا باشند.
$table->integer('order_id')->primary();
4- متد fullText این متد یک ایندکس تمام‌متنی (Full Text Index) برای جستجوی سریع متن در ستون‌های متنی (مثل TEXT یا VARCHAR) ایجاد می‌کند.
$table->fullText('content');
5- متد spatialIndex این متد یک ایندکس مکانی (Spatial Index) برای ستون‌های مختصات جغرافیایی (مانند ستون‌هایی با نوع GEOMETRY) ایجاد می‌کند.
$table->point('coordinates')->spatialIndex();
6- متد renameIndex این متد کلید اصلی جدول را حذف می‌کند.
 $table->dropPrimary();
7- متد dropUnique این متد یک ایندکس یکتا را از جدول حذف می‌کند.
$table->dropUnique('users_email_unique');
8- متد dropIndex این متد یک ایندکس ساده را از جدول حذف می‌کند.
$table->dropIndex('users_username_index');
9- متد dropFullText این متد یک ایندکس تمام‌متنی را از جدول حذف می‌کند.
$table->dropFullText('articles_content_fulltext');
10- متد dropSpatialIndex این متد یک ایندکس مکانی را از جدول حذف می‌کند.
$table->dropSpatialIndex('locations_coordinates_spatialindex');
11- متد foreign این متد مشخص می‌کند که یک ستون در جدول فعلی قرار است به‌عنوان کلید خارجی عمل کند. معمولاً به همراه متدهای references و on استفاده می‌شود.
$table->unsignedBigInteger('user_id');
$table->foreign('user_id');
12- متد references این متد مشخص می‌کند که کلید خارجی به کدام ستون از جدول دیگر اشاره دارد.
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id');
13- متد on این متد مشخص می‌کند که کلید خارجی باید به کدام جدول در پایگاه داده متصل شود.
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
14- متد foreignId این متد یک راه کوتاه‌تر برای تعریف ستون کلید خارجی است. به طور پیش‌فرض، نوع ستون را unsignedBigInteger تعریف می‌کند.
$table->foreignId('user_id');
15- متد constrained این متد تعریف کلید خارجی را آسان‌تر و سریع‌تر می‌کند. زمانی که از آن استفاده کنید: - ستون را به‌عنوان کلید خارجی تعریف می‌کند. - به صورت پیش‌فرض جدول مقصد را از نام ستون حدس می‌زند (مثلاً اگر ستون user_id باشد، به جدول users اشاره می‌کند). - به ستون id به‌عنوان کلید اصلی در جدول مقصد اشاره می‌کند.
$table->foreignId('user_id')->constrained('users');
16- متد dropForeign برای حذف یک کلید خارجی (Foreign Key) در جدول استفاده می‌شود. این متد زمانی استفاده می‌شود که بخواهید محدودیت‌های کلید خارجی روی یک ستون را از بین ببرید.
$table->dropForeign('posts_user_id_foreign');
17و 18- متد های onUpdate و onDelete زمانی که یک کلید خارجی (foreign key) تعریف می‌کنید، می‌توانید رفتار حذف یا به‌روزرسانی رکوردهای مرتبط را مشخص کنید.
$table->foreignId('user_id')->constrained('users')->onDelete('cascade')->onUpdate('cascade');
ورودی می تواند حالت های restrict، set null، no action نیز باشد. 19- متد cascadeOnDelete وقتی رکورد اصلی حذف شود، رکوردهای مرتبط در جدول فرعی هم حذف می‌شوند.
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
20- متد restrictOnDelete اگر رکوردهای مرتبط در جدول فرعی وجود داشته باشند، حذف رکورد اصلی ممنوع است. 21- متد nullOnDelete اگر رکورد اصلی حذف شود، مقدار کلید خارجی در جدول فرعی به NULL تغییر می‌کند. 22- متد noActionOnDelete حذف رکورد اصلی تأثیری روی جدول فرعی ندارد (هیچ کاری انجام نمی‌شود). 23- متد restrictOnUpdate اگر رکورد مرتبط در جدول فرعی وجود داشته باشد، تغییر مقدار کلید خارجی در جدول اصلی ممنوع است. 24- متد nullOnUpdate اگر مقدار کلید خارجی در جدول اصلی تغییر کند، مقدار کلید خارجی در جدول فرعی به NULL تغییر می‌کند. 25- متد noActionOnUpdate تغییر مقدار کلید خارجی در جدول اصلی تأثیری روی جدول فرعی ندارد (هیچ کاری انجام نمی‌شود). #laravel #لاراول #فصل_۵ @AmirhDeveloper .

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها 1- متد after مشخص می‌کند که ستون باید بعد از ستون دیگری قرار گیرد. این متد فقط برای برخی پایگاه‌های داده (مانند MySQL) پشتیبانی می‌شود.
$table->string('middle_name')->after('first_name');
2- متد autoIncrement مشخص می‌کند که ستون به صورت AUTO_INCREMENT تعریف شود.
$table->integer('id')->autoIncrement();
3- متد charset تنظیم charset برای ستون.
$table->string('name')->charset('utf8mb4');
4- متد collation تنظیم collation برای ستون.
$table->string('name')->collation('utf8mb4_unicode_ci');
5- متد comment اضافه کردن یک توضیح برای ستون.
$table->integer('age')->comment('Age of the user in years');
6- متد default مقدار پیش‌فرض برای ستون را تنظیم می‌کند.
$table->string('status')->default('active');
7- متد first مشخص می‌کند که ستون باید در ابتدای جدول قرار گیرد. این متد فقط برای برخی پایگاه‌های داده (مانند MySQL) پشتیبانی می‌شود.
$table->string('first_name')->first();
8- متد from مقدار شروع را برای ستون عددی AUTO_INCREMENT مشخص می‌کند.
$table->integer('id')->autoIncrement()->from(1000);
9- متد invisible مشخص می‌کند که ستون در نتایج کوئری‌های SELECT به‌صورت پیش‌فرض مخفی باشد. این ویژگی فقط در MySQL 8.0.23 یا بالاتر پشتیبانی می‌شود.
$table->string('secret_code')->invisible();
10- متد nullable مشخص می‌کند که ستون می‌تواند مقدار NULL داشته باشد.
$table->string('middle_name')->nullable();
11- متد storedAs
$table->integer('price');
$table->integer('tax');
$table->integer('total')->storedAs('price + tax');
ستون total مقدار price + tax را ذخیره می‌کند. 12- متد unsigned مشخص می‌کند که ستون عددی بدون علامت (unsigned) باشد.
$table->integer('votes')->unsigned();
13- متد useCurrent مقدار پیش‌فرض ستون را به زمان فعلی تنظیم می‌کند. معمولاً برای ستون‌های timestamp یا datetime استفاده می‌شود.
$table->timestamp('created_at')->useCurrent();
14- متد useCurrentOnUpdate مشخص می‌کند که ستون در زمان به‌روزرسانی رکورد به‌صورت خودکار مقدار زمان فعلی را دریافت کند.
$table->timestamp('updated_at')->useCurrentOnUpdate();
15- متد virtualAs ایجاد یک ستون محاسباتی مجازی (Virtual Generated Column). مقدار این ستون در دیتابیس ذخیره نمی‌شود.
$table->integer('price');
$table->integer('tax');
$table->integer('total')->virtualAs('price + tax');
ستون total مقدار price + tax را محاسبه می‌کند ولی ذخیره نمی‌شود. 16- متد generatedAs تعریف یک ستون تولیدشده (Generated Column) با استفاده از عبارت SQL.
$table->integer('price');
$table->integer('tax');
$table->integer('total')->generatedAs('price + tax');
17- متد always معمولاً همراه با ستون‌های تولیدشده (Generated Column) استفاده می‌شود و مقدار آن همیشه از عبارت SQL تولید می‌شود.
$table->integer('total')->generatedAs('price + tax')->always();
18- متد change برای تغییر ویژگی‌های ستون‌های موجود در یک جدول استفاده می‌شود. این متد میتواند پس از 17 متد قبلی فراخوانی شود و ویژگی های ستون فعلی را ویرایش کند.
$table->integer('id')->autoIncrement()->change();
در این مثال، ستون id به صورت AUTO_INCREMENT ایجاد نشده است، اما با این متد به صورت AUTO_INCREMENT ویرایش می شود. 19- متد dropMorphs این متد برای حذف ستونی که مربوط به Polymorphic Relations است، استفاده می‌شود.
$table->dropMorphs('commentable');
20- متد dropRememberToken این متد برای حذف ستونی که برای ذخیره‌ی remember token در جداول کاربران استفاده می‌شود، به کار می‌رود.
$table->dropRememberToken();
21- متد dropSoftDeletes این متد برای حذف ستون‌هایی که مربوط به Soft Deletes هستند استفاده می‌شود.
$table->dropSoftDeletes();
22- متد dropSoftDeletesTz این متد مشابه dropSoftDeletes است، اما برای ستون‌هایی که از نوع timestamp with timezone استفاده می‌کنند. 23- متد dropTimestamps این متد برای حذف ستون‌های created_at و updated_at استفاده می‌شود.
$table->dropTimestamps();
24- متد dropTimestampsTz این متد مشابه dropTimestamps است، اما برای ستون‌های created_at و updated_at که با نوع timestamp with timezone ذخیره شده‌اند، استفاده می‌شود. #laravel #لاراول #فصل_۵ @AmirhDeveloper .

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها 1- متد macAddress ایجاد ستونی برای ذخیره آدرس MAC.
$table->macAddress('device_mac');
2- متد mediumIncrements ایجاد کلید اصلی AUTO_INCREMENT از نوع MEDIUMINT.
$table->mediumIncrements('id');
3- متد mediumInteger ایجاد ستون عدد صحیح از نوع MEDIUMINT. 4- متد mediumText ایجاد ستون متنی از نوع MEDIUMTEXT.
$table->mediumText('summary');
5- متد morphs این متد دو ستون morphable_id (عدد صحیح) و morphable_type (متن) برای پیاده‌سازی روابط چندشکلی (polymorphic) ایجاد می‌کند.
$table->morphs('commentable');
در این مثال، ستون‌های commentable_id و commentable_type برای رابطه چندشکلی ایجاد می‌شوند. 6- متد nullableMorphs مشابه morphs، اما ستون‌ها به صورت nullable تعریف می‌شوند.
$table->nullableMorphs('taggable');
7- متد nullableTimestamps ایجاد دو ستون created_at و updated_at که می‌توانند nullable باشند.
$table->nullableTimestamps(precision: 0);
8- متد nullableUlidMorphs مشابه nullableMorphs، اما ستون‌های کلید خارجی از نوع ULID هستند و nullable تعریف می‌شوند.
$table->nullableUlidMorphs('taggable');
9- متد nullableUuidMorphs مشابه nullableMorphs، اما ستون‌ها از نوع UUID هستند و nullable تعریف می‌شوند. 10- متد rememberToken ایجاد ستونی به نام remember_token برای مدیریت توکن‌های احراز هویت.
$table->rememberToken();
11- متد set ایجاد ستونی از نوع SET که می‌تواند شامل یک یا چند مقدار از یک مجموعه مشخص باشد.
$table->set('flavors', ['strawberry', 'vanilla']);
12- متد smallIncrements ایجاد کلید اصلی AUTO_INCREMENT از نوع SMALLINT.
$table->smallIncrements('id');
13- متد smallInteger ایجاد ستون عدد صحیح از نوع SMALLINT. 14- متد softDeletesTz ایجاد ستونی برای Soft Delete با پشتیبانی از منطقه زمانی.
$table->softDeletesTz('deleted_at', precision: 0);
15- متد softDeletes ایجاد ستونی برای Soft Delete بدون منطقه زمانی. 16- متد string ایجاد ستونی متنی (رشته‌ای).
$table->string('name', length: 100);
17- متد text ایجاد ستونی متنی طولانی.
$table->text('description');
18- متد timeTz ایجاد ستونی برای ذخیره زمان همراه با منطقه زمانی.
$table->timeTz('sunrise', precision: 0);
19- متد time ایجاد ستونی برای ذخیره زمان بدون منطقه زمانی. 20- متد timestampTz ایجاد ستونی برای ذخیره تایم‌استمپ همراه با منطقه زمانی.
$table->timestampTz('added_at', precision: 0);
21- متد timestamp ایجاد ستونی برای ذخیره تایم‌استمپ بدون منطقه زمانی. 22- متد timestampsTz ایجاد دو ستون created_at و updated_at همراه با منطقه زمانی.
$table->timestampsTz(precision: 0);
23- متد timestamps ایجاد دو ستون created_at و updated_at بدون منطقه زمانی. 24- متد tinyIncrements ایجاد کلید اصلی AUTO_INCREMENT از نوع TINYINT.
$table->tinyIncrements('id');
25- متد tinyInteger ایجاد ستون عدد صحیح کوچک از نوع TINYINT. 26- متد tinyText ایجاد ستون متنی کوچک (حداکثر 255 کاراکتر).
$table->tinyText('notes');
27- متد unsignedBigInteger ایجاد ستون BIGINT بدون علامت.
$table->unsignedBigInteger('votes');
28- متد unsignedInteger ایجاد ستون INT بدون علامت. 29- متد unsignedMediumInteger ایجاد ستون MEDIUMINT بدون علامت. 30- متد unsignedSmallInteger ایجاد ستون SMALLINT بدون علامت. 31- متد unsignedTinyInteger ایجاد ستون TINYINT بدون علامت. 32- متد ulidMorphs ایجاد ستون‌های رابطه چندشکلی (morphable_id و morphable_type) از نوع ULID.
$table->ulidMorphs('taggable');
33- متد uuidMorphs ایجاد ستون‌های رابطه چندشکلی (morphable_id و morphable_type) از نوع UUID. 34- متد ulid ایجاد ستونی از نوع ULID برای ذخیره شناسه‌های یکتا.
$table->ulid('id');
35- متد uuid ایجاد ستونی از نوع UUID برای ذخیره شناسه‌های یکتا. 36- متد vector ایجاد ستونی برای ذخیره داده‌های برداری (Vector Data). این متد معمولاً برای ذخیره داده‌های پیچیده مانند مدل‌های یادگیری ماشینی استفاده می‌شود.
$table->vector('embedding', dimensions: 100);
37- متد year ایجاد ستونی برای ذخیره سال (از نوع YEAR).
$table->year('birth_year');
#laravel #لاراول #فصل_۵ @AmirhDeveloper .

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها کلاس Blueprint در لاراول به عنوان ابزاری در مایگریشن‌ها استفاده می‌شود که امکان تعریف، تغییر و حذف ستون‌ها و ویژگی‌های جداول پایگاه داده را فراهم می‌کند. این کلاس همراه با متدهای Schema به کار می‌رود و مجموعه‌ای از متدها را برای مدیریت ستون‌ها و ایندکس‌ها ارائه می‌دهد. مثال:
Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
});
در این مثال، کلاس Blueprint برای تعریف ساختار جدول users استفاده شده است. این جدول دارای سه ستون اصلی است. از این قسمت به بررسی و توضیح متد های مدیریت جداول می پردازیم. 1- متد bigIncrements این متد یک ستون کلید اصلی با نوع داده BIGINT ایجاد می‌کند که مقدار آن به صورت AUTO_INCREMENT خواهد بود.
$table->bigIncrements('id');
2- متد bigInteger این متد یک ستون عدد صحیح بزرگ (BIGINT) ایجاد می‌کند که می‌تواند برای ذخیره اعداد بزرگ استفاده شود.
$table->bigInteger('views');
3- متد binary این متد یک ستون با نوع داده باینری برای ذخیره داده‌های خام (مانند فایل‌ها) ایجاد می‌کند.
$table->binary('file_data', length: 16, fixed: true);
4- متد boolean این متد یک ستون Boolean ایجاد می‌کند که برای ذخیره مقادیر منطقی استفاده می‌شود.
$table->boolean('is_active');
5- متد char این متد یک ستون متنی با طول ثابت ایجاد می‌کند.
$table->char('code', length: 10);
6- متد dateTimeTz این متد یک ستون تاریخ و زمان با پشتیبانی از منطقه زمانی (timezone) ایجاد می‌کند.
$table->dateTimeTz('start_time', precision: 0);
7- متد dateTime این متد یک ستون تاریخ و زمان بدون منطقه زمانی ایجاد می‌کند.
$table->dateTime('created_at', precision: 0);
8- متد date این متد یک ستون برای ذخیره تنها تاریخ (بدون زمان) ایجاد می‌کند.
$table->date('birth_date');
9- متد decimal این متد یک ستون عددی دقیق با نقطه اعشار ایجاد می‌کند.
$table->decimal('price', total: 10, places: 2);
در این مثال، ستون price برای ذخیره اعداد با حداکثر 10 رقم و 2 رقم اعشار ایجاد می‌شود. 10- متد double این متد یک ستون عددی با دقت شناور (دقت کمتر از decimal) ایجاد می‌کند.
$table->double('rating');
11- متد enum این متد یک ستون از نوع ENUM ایجاد می‌کند که مقادیر آن باید از مجموعه‌ای از مقادیر از پیش تعریف‌شده باشد.
$table->enum('status', ['pending', 'approved', 'rejected']);
12- متد float ایجاد ستون عددی شناور (مانند double) که برای اعداد تقریبی مناسب است.
$table->float('amount', precision: 53);
13- متد foreignId ایجاد ستون عددی برای استفاده به عنوان کلید خارجی، معمولاً با نام id جدول مرجع.
$table->foreignId('user_id');
14- متد foreignIdFor ایجاد ستون کلید خارجی و مشخص کردن کلاس مدل مرجع.
$table->foreignIdFor(User::class);
15- متد foreignUlid ایجاد کلید خارجی با نوع ULID.
$table->foreignUlid('user_id');
16- متد foreignUuid ایجاد کلید خارجی از نوع UUID.
$table->foreignUuid('user_id');
17- متد geography ایجاد ستون جغرافیایی برای ذخیره داده‌های مکانی (مانند طول و عرض جغرافیایی).
$table->geography('coordinates', subtype: 'point', srid: 4326);
18- متد geometry ایجاد ستون هندسی برای ذخیره داده‌های مکانی.
$table->geometry('positions', subtype: 'point', srid: 0);
19- متد id ایجاد ستون کلید اصلی به صورت خودکار.
$table->id();
20- متد increments ایجاد کلید اصلی AUTO_INCREMENT از نوع INT.
$table->increments('id');
21- متد integer ایجاد ستون عدد صحیح.
$table->integer('votes');
22- متد ipAddress ایجاد ستونی برای ذخیره آدرس IP.
$table->ipAddress('visitor');
23- متد json ایجاد ستون برای ذخیره داده‌های JSON.
$table->json('options');
24- متد jsonb مشابه json، اما برای دیتابیس‌های پشتیبانی‌کننده از نوع JSONB (مانند PostgreSQL) استفاده می‌شود.
$table->jsonb('options');
25- متد longText ایجاد ستون متنی طولانی.
$table->longText('description');
#laravel #لاراول #فصل_۵ @AmirhDeveloper .

🔴 سیستم جدیدی که در آپدیت های آینده به LaraGram اضافه میشه، سیستمی برای مدیریت خطا ها در استفاده از متد های Telegram هست. ◀️
🔴 سیستم جدیدی که در آپدیت های آینده به LaraGram اضافه میشه، سیستمی برای مدیریت خطا ها در استفاده از متد های Telegram هست. ◀️ 3 متد اضافه میشه که روی تمامی API Method های Teelgram به صورت Chain اجرا میشه. ◀️ متد اول tries هست که تعداد تلاش ها برای اجرای یک متد رو مشخص میکنه، به عنون مثال اگر هر 5 بار اجرای متد شکست خورد، متد دوم یعنی catch اجرا میشه و کالبک خودش رو که همراه با خطا هست اجرا میکه. ◀️ متد catch نیز درصورت برخورد با خطا میتونه چندین بار تلاش برای اجرا کالبک خودش بکنه، و درصورتی که تلاش های catch هم با شکست مواجه شد، متد سوم یعنی finally، کالبک خودش رو اجرا میکنه. 🔴 این 3 متد برای مدیریت خطا های سمت API بسیار مفید هستن. ⭐️ اگر مایل بودید با دادن استار به ریپوزیوری ها از پروژه ها حمایت کنید. 📱 LaraGram 📱 Laraquest 📱 Core ✅ @AmirhDeveloper ✅ @LaraXGram .

منی که دوباره ۲۰۰ تا متد برای توضیح آماده کردم: 😐

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها برای ساخت یک جدول ساده با استفاده از مایگریشن در لاراول، می‌توانید مراحل زیر را انجام دهید: ابتدا یک فایل مایگریشن جدید با دستور زیر ایجاد می‌کنیم:
php artisan make:migration create_posts_table --create=posts
این دستور یک فایل مایگریشن جدید به نام create_posts_table در پوشه database/migrations ایجاد می‌کند. حالا می‌توانید به فایل ایجاد شده مراجعه کنید و متد up() را ویرایش کنید تا جدول posts ساخته شود. به عنوان مثال:
return new class extends Migration
{
 public function up()
 {
  Schema::create('posts', function (Blueprint $table) {
   $table->id();
   $table->string('title');
   $table->text('content')->nullable();
   $table->timestamps();
  });
 }

 public function down()
 {
  Schema::dropIfExists('posts');
 }
}
مایگریشن بالا یک جدول با نام posts ایجاد میکند و 5 فیلد مشخص شده در متد up را در آن ایجاد میکند. در نهایت، برای اجرای مایگریشن و ایجاد جدول در پایگاه داده، دستور زیر را اجرا کنید:
php artisan migrate
در ادامه متد های قابل استفاده برای ساخت جدول توضیح داده می شود. در این قسمت با یک فساد جدید به نام Schema آشنا می شویم، این فساد برای تعریف، ایجاد، تغییر و حذف جداول و ستون‌های پایگاه داده در مایگریشن‌ها به‌کار می‌رود. 1- متد create این متد برای ایجاد یک جدول جدید استفاده می‌شود. درون این متد، می‌توان با استفاده از کلاس Blueprint ستون‌ها و ویژگی‌های جدول را تعریف کرد.
Schema::create('posts', function (Blueprint $table) {
 //
});
2- متد table این متد مشابه create اما برای تغییر ساختار یک جدول موجود استفاده می‌شود. می‌توانید ستون‌ها را اضافه، تغییر یا حذف کنید. 3- متد hasTable این متد بررسی می‌کند که آیا جدول مشخصی در پایگاه داده وجود دارد یا خیر.
if (Schema::hasTable('posts')) {
 //
}
4- متد hasColumn این متد بررسی می‌کند که آیا ستون خاصی در یک جدول مشخص وجود دارد یا خیر.
if (Schema::hasColumn('posts', 'title')) {
 //
}
5- متد hasIndex این متد بررسی می‌کند که آیا یک ایندکس (کلید یا شاخص) خاص در جدول موردنظر وجود دارد یا خیر. توجه داشته باشید که این متد ممکن است به همراه برخی نسخه‌های دیتابیس‌ها یا پل‌های خاص لاراول بیشتر کاربرد داشته باشد.
if (Schema::hasIndex('posts', 'posts_title_index')) {
 //
}
6- متد connection این متد برای انجام عملیات Schema بر روی یک اتصال خاص پایگاه داده استفاده می‌شود. به شما اجازه می‌دهد با دیتابیس‌های مختلفی کار کنید.
Schema::connection('sqlite')->create('products', function (Blueprint $table) {
 //
});
7- متد rename این متد نام یک جدول را تغییر می‌دهد.
Schema::rename('old_posts', 'new_posts');
8- متد drop این متد برای حذف کامل یک جدول استفاده می‌شود.
Schema::drop('posts');
9- متد dropIfExists این متد جدول را تنها در صورتی که وجود داشته باشد، حذف می‌کند. این رویکرد از بروز خطا در صورت عدم وجود جدول جلوگیری می‌کند. 10- متد enableForeignKeyConstraints این متد، محدودیت‌های کلید خارجی را در پایگاه داده فعال می‌کند. این متد معمولاً در سیستم‌های مدیریت پایگاه داده مانند MySQL و SQLite مفید است.
Schema::enableForeignKeyConstraints();
11- متد disableForeignKeyConstraints این متد، محدودیت‌های کلید خارجی را در پایگاه داده غیرفعال می‌کند. غیرفعال کردن محدودیت‌ها می‌تواند برای حذف جداول یا تغییر ساختار آنها (مانند حذف یا اضافه کردن ستون‌های مرتبط) که ممکن است در حالت عادی باعث خطا شود، مفید باشد. 12- متد withoutForeignKeyConstraints این متد یک Closure را اجرا می‌کند که در حین اجرای آن، محدودیت‌های کلید خارجی به طور موقت غیرفعال می‌شوند. پس از پایان اجرای Closure، محدودیت‌ها به‌طور خودکار به حالت اولیه بازمی‌گردند.
Schema::withoutForeignKeyConstraints(function () {
 Schema::dropIfExists('posts');
});
در قسمت ها بعدی با متد کلاس Blueprint برای کار با column ها می پردازیم. ▫️ 🟠 🔎 #laravel #لاراول #فصل_۵ 💠 @AmirhDeveloper .

فصل پنج - Migrations and Database بخش اول - تعریف و اجرای Migrationها در لاراول، Migrations یک سیستم برای مدیریت و ایجاد تغییرات در ساختار پایگاه داده است. این سیستم به توسعه‌دهندگان امکان می‌دهد تا جدول‌ها، ستون‌ها و روابط پایگاه داده را با استفاده از کد PHP تعریف، تغییر و مدیریت کنند. با استفاده از مایگریشن ها، تغییرات در پایگاه داده در کنار کد پروژه نگهداری می‌شود و می‌توان آن را به‌راحتی در محیط‌های مختلف به‌روزرسانی کرد. اهداف و مزایای استفاده از مایگریشن‌ها 1- مایگریشن ها به شما این امکان را می‌دهند که تغییرات پایگاه داده را با تغییرات کد هماهنگ کنید. 2- به‌راحتی می‌توانید تغییرات اعمال شده را به نسخه قبلی برگردانید. 3- وقتی توسعه‌دهندگان مختلف روی یک پروژه کار می‌کنند، می‌توانند تغییرات پایگاه داده را به‌صورت کنترل‌شده و منظم در بین خودشان به اشتراک بگذارند. 4- به‌جای ویرایش دستی پایگاه داده، می‌توانید از دستورات ساده برای افزودن یا تغییر جداول استفاده کنید. ایجاد و اجرای مایگریشن برای ایجاد مایگریشن جدید، می‌توانید از دستور Artisan زیر استفاده کنید:
php artisan make:migration create_users_table --create=users
فلگ --create بیانگر این است که مایگریشن برای ساخت جدول جدید می باشد. این دستور یک فایل مایگریشن جدید در پوشه database/migrations ایجاد می‌کند. در فایل مایگریشن معمولاً دو متد اصلی وجود دارد: 1- متد up شامل دستوراتی برای ایجاد یا تغییر ساختار جدول (افزودن ستون‌ها، روابط و غیره) است. 2- متد down شامل دستوراتی برای بازگردانی تغییرات اعمال‌شده در متد up() است. ساختار یک فایل مایگریشن یک مایگریشن نمونه، به شکل زیر است:
return new class extends Migration
{
 public function up(): void
 {
  Schema::create('flights', function (Blueprint $table) {
   $table->id();
   $table->string('name');
   $table->string('airline');
   $table->timestamps();
  });
 }

 public function down(): void
 {
  Schema::drop('flights');
 }
};
اجرای مهاجرت‌ها برای اجرای مایگریشن‌ها و اعمال تغییرات روی پایگاه داده از دستور زیر استفاده می‌شود:
php artisan migrate
این دستور تمامی مایگریشن‌هایی که هنوز اجرا نشده‌اند را اعمال می‌کند. برای بازگرداندن آخرین سری از تغییرات می‌توانید از دستور زیر استفاده کنید:
php artisan migrate:rollback
برای بازگرداندن تمامی تغییرات و شروع از ابتدا:
php artisan migrate:reset
سایر دستورات در پست مربوطه توضیح داده می شود. تغییرات در جداول موجود اگر بخواهید تغییراتی در جداول موجود اعمال کنید، باید از مایگریشن جدیدی استفاده کنید. مثلاً برای افزودن ستون به جدول users می‌توانید از دستور زیر بهره ببرید:
php artisan make:migration add_phone_to_users_table --table=users
فلگ --table بیانگر این است که مایگریشن برای ویرایش جدول موجود می باشد. سپس در فایل مایگریشن ایجادشده می‌توانید تغییرات خود را اعمال کنید. اصول نام‌گذاری مایگریشن‌ها انتخاب نام‌های مناسب برای مایگریشن‌ها از اهمیت ویژه‌ای برخوردار است، زیرا نه تنها باعث خوانایی و شفافیت کد می‌شود، بلکه به وضوح نقش و وظیفه‌ی هر مایگریشن را مشخص می‌کند. لاراول از نام فایل‌ها و کلاس‌های مایگریشن برای سازمان‌دهی و اجرای صحیح آن‌ها استفاده می‌کند. 1- نام مایگریشن باید عملی که انجام می‌دهد را توصیف کند. به عنوان مثال: create_users_table add_email_to_users_table remove_phone_from_users_table update_orders_status 2- نام مایگریشن معمولاً با فعلی که عمل اصلی را توصیف می‌کند شروع می‌شود، سپس به اسم جدول یا ستون مورد نظر اشاره می‌کند. این قالب باعث شفافیت بیشتر می‌شود و به راحتی می‌توان فهمید که مایگریشن چه کاری انجام می‌دهد. 3- هنگام اشاره به جداول، معمولاً از نام‌های جمع استفاده می‌شود. برای مثال، مایگریشن مربوط به جدول کاربران به صورت create_users_table نام‌گذاری می‌شود و نه create_user_table. 4- سعی کنید از نام‌های طولانی و زائد پرهیز کنید. نام‌ها باید توصیفی و مختصر باشند. برای مثال، به جای add_new_email_column_to_users_table می‌توانید از add_email_to_users_table استفاده کنید. 5- برای نام‌گذاری فایل‌ها و کلاس‌های مایگریشن از قالب snake_case استفاده می‌شود، که بین کلمات از خط زیرین _ استفاده می‌کند. این قالب به‌طور پیش‌فرض توسط دستور php artisan make:migration رعایت می‌شود. در قسمت بعدی با متد های ساخت جداول به وسیله ی مایگریشن ها آشنا می شویم. ▫️ 🟠 🔎 #laravel #لاراول #فصل_۵ 💠 @AmirhDeveloper .

فصل 4 اینجا به پایان رسید. این فصل طولانی ترین فصل بود، و سایر فصل ها سریع تر پیش میرن. اگر چیزی در رابطه با الوکوئنت و مدل ها جا مونده بگید توضیح بدیم و فصل 5 رو شروع کنیم.

فصل چهار - مدل‌ها و Eloquent ORM بخش دهم - Route Model Binding ‏Route Model Binding به ما اجازه می‌دهد تا به صورت مستقیم و خودکار مدل‌های لاراول را از URL به دست آوریم و در کنترلر استفاده کنیم. به عنوان مثال، اگر یک Post داریم و بخواهیم یک پست خاص را با استفاده از شناسه (ID) در URL بازیابی کنیم، معمولاً بدون استفاده از این ویژگی کدی شبیه به زیر می‌نویسیم:
Route::get('/posts/{id}', function($id) {
 $post = Post::findOrFail($id);
 return view('posts.show', compact('post'));
});
اما با استفاده از Route Model Binding می‌توانیم کد را ساده‌تر کنیم:
Route::get('/posts/{post}', function(Post $post) {
 return view('posts.show', compact('post'));
});
لاراول از مقدار {post} در مسیر استفاده می‌کند تا مدل Post را بر اساس مقدار (به طور پیش‌فرض id) جستجو کرده و به کنترلر ارسال کند. نکته: این قابلیت برای انواع مدل‌ها قابل استفاده است و شما می‌توانید از Custom Key‌ها نیز استفاده کنید. همانطور که توضیح داده شد، {post} به طور پیشفرض بر اساس فیلد id جست و جو می کند، اما میتوانید به سادگی فیلد پیشفرض را تغییر دهید:
Route::get('/posts/{post:slug}', function(Post $post) {
 return view('posts.show', compact('post'));
});
در کد بالا به جای {post}، از {post:slug} استفاده شده، به این معنی که از فیلد slug برای جست و جو استفاده شود، میتوانید فیلد مورد نظر را به جای slug بنویسید. همچنین میتوانید فیلد پیشفرض را در مدل تغییر دهید:
class Post extends Model
{
 public function getRouteKeyName()
 {
  return 'slug';
 }
}
در این صورت با نوشتن {post} به طور پیشفرض از فیلد slug برای جست و جو استفاده می شود. ▫️ 🟠 🔎 #laravel #لاراول #فصل_۴ 💠 @AmirhDeveloper .

فصل چهار - مدل‌ها و Eloquent ORM بخش نهم - Transactions تراکنش‌ها یا Transactionها برای انجام چندین عملیات پایگاه داده به صورت یکجا استفاده می‌شوند. به عبارت دیگر، اگر همه عملیات موفق باشند، تغییرات به پایگاه داده اعمال می‌شود، اما اگر یکی از عملیات‌ها با خطا مواجه شود، تمامی تغییرات لغو می‌شوند (rollback). این موضوع به ویژه برای اطمینان از یکپارچگی داده‌ها در سناریوهایی که شامل چندین عملیات هستند مفید است، مانند ثبت چند جدول همزمان، مدیریت تراکنش‌های بانکی و غیره. لاراول برای مدیریت تراکنش‌ها متدهایی را فراهم می‌کند که در فساد DB قرار دارند. متد ها عبارتند از: 1- متد beginTransaction برای شروع یک تراکنش. 2- متد commit برای تأیید و ثبت تراکنش. 3- متد rollBack برای لغو تغییرات در صورت بروز خطا. 4- متد afterCommit برای انجام عملیات پس از commit. مثال:
try {
 DB::beginTransaction();

 DB::table('users')->insert([
  'name' => 'John',
  'email' => 'john@example.com',
  'password' => bcrypt('1234')
 ]);

 DB::table('profiles')->insert([
  'user_id' => 1,
  'bio' => 'Test Bio',
  'age' => 25
 ]);

 DB::commit();
} catch (\Exception $e) {
 DB::rollBack();
 echo "Error: " . $e->getMessage();
}
در ابتدا تراکنش با beginTransaction آغاز می‌شود. دو عملیات insert در جدول‌های مختلف انجام می‌شود. اگر همه عملیات بدون خطا انجام شوند، با commit تغییرات ثبت می‌شود. اگر خطا رخ دهد (مانند ارور در هر یک از عملیات)، با استفاده از catch خطا مدیریت شده و rollBack فراخوانی می‌شود تا تغییرات لغو شود. لاراول همچنین یک متد ساده‌تر و قابل خواندن‌تر به نام transaction ارائه می‌دهد که می‌توان کل تراکنش را در یک Closure قرار داد: مثال:
DB::transaction(function () {
 DB::table('users')->insert([
  'name' => 'John',
  'email' => 'john@example.com',
  'password' => bcrypt('1234')
 ]);

 DB::table('profiles')->insert([
  'user_id' => 2,
  'bio' => 'Test Bio',
  'age' => 30
 ]);
})
اگر کد داخل transaction موفق باشد، تغییرات به صورت خودکار ذخیره (commit) می‌شود. در صورت بروز خطا، تغییرات به صورت خودکار لغو (rollback) می‌شوند. این متد علاوه بر اجرای کد در قالب تراکنش، تعداد دفعاتی که باید در صورت مواجهه با خطا مجدد تلاش کند را می‌پذیرد. این ویژگی برای مواقعی که با عملیات‌های رقابتی روبرو هستید (مانند lockها یا عملیات با احتمال تعارض) مفید است.
DB::transaction(function () {
 // 
}, 3)
متد afterCommit به شما امکان می‌دهد که یک callback یا عملیات خاص را پس از موفقیت‌آمیز بودن commit اجرا کنید. برای مثال، می‌توانید پس از ذخیره تغییرات، رویدادهایی مثل ارسال ایمیل را انجام دهید.
DB::afterCommit(function () {
 echo "Success";
});
می‌توانید از پارامترهایی برای کنترل تراکنش استفاده کنید. به عنوان مثال، تنظیم چندین تراکنش تو در تو (nested transactions) نیز در لاراول امکان‌پذیر است. تراکنش‌ها در سناریوهایی مانند عملیات مالی، مدیریت سفارشات یا عملیات‌های مربوط به موجودی کالا اهمیت زیادی دارند. با استفاده از آن‌ها می‌توانید از ناسازگاری داده‌ها و بروز اشکالات جدی در پایگاه داده جلوگیری کنید. به طور خلاصه، تراکنش‌ها در لاراول به شما امکان می‌دهند عملیات مختلف پایگاه داده را به صورت امن انجام دهید، به طوری که در صورت بروز خطا همه تغییرات برگردانده شود. ▫️ 🟠 🔎 #laravel #لاراول #فصل_۴ 💠 @AmirhDeveloper .

فصل چهار - مدل‌ها و Eloquent ORM بخش هشتم - Observers مشاهده‌گرها یا Observer‌ ها به عنوان کلاس‌هایی شناخته می‌شوند که برای نظارت بر رخدادهای مدل‌های Eloquent طراحی شده‌اند. زمانی که می‌خواهید منطق خاصی را قبل یا بعد از رخ دادن یک عمل (مانند ایجاد، به‌روزرسانی یا حذف یک رکورد) انجام دهید، می‌توانید از Observerها استفاده کنید. این امر منجر به جداسازی بهتر منطق بیزنسی از کنترلرها و مدل‌ها و بهبود قابلیت نگهداری کد می‌شود. لاراول اجازه می‌دهد تا به چندین رخداد پیش‌فرض مدل گوش دهید که با آنها در بخش قبل آشنا شدیم. برای ایجاد یک Observer جدید می‌توانید از دستور Artisan استفاده کنید:
php artisan make:observer UserObserver --model=User
این دستور یک کلاس به نام UserObserver می‌سازد و آن را با مدل User مرتبط می‌کند. پس از ایجاد، شما می‌توانید متدهایی مانند created، updated و غیره را در آن تعریف کنید تا بر اساس رخدادها اجرا شوند. فرض کنید می‌خواهیم زمانی که یک کاربر جدید ایجاد شد، یک پیام خوش‌آمدگویی برای او ارسال شود. ابتدا یک Observer برای مدل User ایجاد می‌کنیم. در فایل app/Observers/UserObserver.php کدی مانند زیر را اضافه می‌کنیم:

class UserObserver
{
 public function created(User $user)
 {
  Mail::to($user->email)->send(new \App\Mail\WelcomeMail($user));
 }
}
متد created درواقع یک رخداد است که با لیست آنها در بخش قبل آشنا شده ایم، درنتیجه میتوان از هر یک از آنها بسته به نیاز به جای created استفاده کرد. باید این Observer را در AppServiceProvider یا هر جای دیگری که مناسب است، ثبت کنید. این کار معمولاً در متد boot انجام می‌شود:
class AppServiceProvider extends ServiceProvider
{
 public function boot()
 {
  User::observe(UserObserver::class);
 }
}
اکنون، هر بار که یک شیء جدید از مدل User ایجاد شود، متد created در UserObserver فراخوانی می‌شود و ایمیل خوش‌آمدگویی ارسال می‌شود. ▫️ 🟠 🔎 #laravel #لاراول #فصل_۴ 💠 @AmirhDeveloper .