| AmirHossein | – Telegram
| AmirHossein |
591 subscribers
44 photos
8 videos
2 files
73 links
نوشته‌های یک برنامه‌نویس ناشی

🫂 @StartUnity
Download Telegram
فصل دو - Controllers

بخش اول - ایجاد و استفاده از کنترلرها


کنترلرها (Controllers) یکی از اجزای اصلی معماری MVC (Model-View-Controller) هستند. کنترلرها وظیفه دارند درخواست‌های ورودی را مدیریت کرده و پاسخ‌های مناسب را به سمت کاربر ارسال کنند.

تعریف کنترلرها:

کنترلرها در لاراول فایل‌هایی هستند که در پوشه app/Http/Controllers قرار می‌گیرند و شامل کلاس‌هایی هستند که مسئولیت کنترل جریان درخواست‌ها و پاسخ‌ها را بر عهده دارند. به طور کلی، کنترلرها به منظور جداسازی منطق تجاری (Business Logic) از منطق نمایش (Presentation Logic) استفاده می‌شوند.

ایجاد کنترلر:
برای ایجاد یک کنترلر در لاراول، می‌توانید از کامند Artisan استفاده کنید. به عنوان مثال:
php artisan make:controller UserController


این دستور یک کنترلر جدید به نام UserController در پوشه app/Http/Controllers ایجاد می‌کند.

انواع کنترلرها:

لاراول چندین نوع کنترلر را پشتیبانی می‌کند:

1- کنترلرهای پایه (Plain Controllers): کنترلرهای ساده‌ای که شامل متدهای مختلف برای مدیریت درخواست‌ها هستند.

2- کنترلرهای منبع (Resource Controllers): کنترلرهایی که برای عملیات CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) بهینه شده‌اند. می‌توانید با استفاده از دستور زیر یک کنترلر منبع ایجاد کنید:
php artisan make:controller UserController --resource


این کنترلر شامل 7 متد پیشفرض است:
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
public function index()
{
// show users list
}

public function create()
{
// show create form
}

public function store(Request $request)
{
// store user data
}

public function show($id)
{
// show user data
}

public function edit($id)
{
// show edit form
}

public function update(Request $request, $id)
{
// update user data
}

public function destroy($id)
{
// delete user
}
}


3- کنترلرهای قابل توزیع (Singleton Controllers): کنترلرهایی که تنها یک نمونه از آن‌ها در طول عمر درخواست ایجاد می‌شود.
php artisan make:controller SingletonController --invokable


نمونه کنترلر برای انجام یک عملیات:
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SingletonController extends Controller
{
public function __invoke()
{
//
}
}


مسیر دهی کنترلرها در روتینگ

برای اتصال یک route به کنترلر روش های متنوعی وجود دارد که در ادامه بررسی خواهیم کرد:
1-
Route::get("/users", "app\Http\Controllers\UserController@index");


در مثال بالا پارامتر دوم به متد index از کنترلر UserController اشاره دارد.
ابتدا نام کامل کنترلر سپس @ و بعد نام متد.

2-
use app\Http\Controllers\UserController;
Route::get("/users", [UserController::class, 'index']);


روش بالا یک روش دیگر برای فراخوانی یک متد از کنترلر است، به این صورت که در یک آرایه، اندیس صفر برابر کلاس کنترلر و اندیس یک برابر نام متد.

برای فراخوانی کنترلر های resource میتوانید از متد دیگری از فساد Route استفاده کنید.
Route::resource('users', UserController::class);


این متد به صورت خودکار 7 متد کنترلر را مسیردهی می کند.

همچنین متد دیگری از فساد Route برای کنترلر ها در دسترس است:
Route::controller(UserController::class)->group(function(){
Route::get("/users", 'index');
});


در روش بالا یک گروه برای یک کنترلر ایجاد می کنید و پس از آن تنها نام متد کنترلر را به عنوان اکشن وارد می کنید.

#laravel #فصل_۲
@AmirhDeveloper
.
10👍21
فصل دو - Controllers

بخش دوم - کنترلر های API و Dependency Injection


کنترلر های API:


کنترلرهای API به‌طور خاص برای مدیریت درخواست‌های API استفاده می‌شوند. در اینجا توضیحاتی درباره کنترلرهای API در لاراول ارائه می‌شود:

برای ایجاد یک کنترلر API، می‌توانید از دستور زیر استفاده کنید:
php artisan make:controller Api/UserController --api


این دستور یک کنترلر جدید در مسیر app/Http/Controllers/Api ایجاد می‌کند که شامل متدهای پایه‌ای مانند index, store, show, update و destroy می‌شود.

برای دسترسی به متدهای کنترلر API، باید مسیرهای مناسب را تعریف کنید. در فایل routes/api.php، می‌توانید مسیرها را به صورت زیر تعریف کنید:

برای تعریف این مسیر ها از متد جدیدی از فساد Route استفاده می کنیم:
use App\Http\Controllers\Api\MyController;

Route::apiResource('users', MyController::class);


در صورتی که فایل api.php برای شما در پوشه routes وجود ندارد با دستور زیر آن را ایجاد کنید:
php artisan install:api


تفاوت یک کنترلر API با کنترلر Resource در این است که متد های create و edit در کنترلر API وجود ندارد، زیرا در API ها نیازی به رندر کردن View نیست.

دپندنسی اینجکشن در کنترلر ها:

دپندنسی اینجکشن (Dependency Injection) یکی از اصول مهم طراحی شیءگرا است که به شما کمک می‌کند وابستگی‌های کلاس‌ها را مدیریت کنید و کد قابل تست و قابل نگهداری بنویسید. در لاراول، دپندنسی اینجکشن به سادگی با استفاده از سیستم سرویس کانتینر (Service Container) این فریمورک امکان‌پذیر است.

نکته: درمورد سرویس کانتینر و پروایدر ها در فصل های آینده به طور مفصل توضیح داده می شود.

دپندنسی اینجکشن به این معنا است که یک کلاس به جای اینکه خودش مسئول ایجاد وابستگی‌هایش باشد، این وابستگی‌ها از بیرون به آن تزریق می‌شوند. به عبارت دیگر، وابستگی‌های یک کلاس به عنوان پارامترهای سازنده (constructor) یا متدهای دیگر به آن تحویل داده می‌شوند.

فرض کنید می‌خواهیم یک کنترلر ایجاد کنیم که برای انجام عملیات‌های مربوط به یک مخزن داده (Repository) نیاز به یک سرویس دارد.

ابتدا یک اینترفیس برای مخزن داده تعریف می‌کنیم:
// app/Repositories/UserRepositoryInterface.php
namespace App\Repositories;

interface UserRepositoryInterface {
public function all();
}


سپس یک پیاده‌سازی برای این اینترفیس ایجاد می‌کنیم:
// app/Repositories/UserRepository.php
namespace App\Repositories;

use App\Models\User;

class UserRepository implements UserRepositoryInterface {
public function all() {
return User::all();
}
}


باید پیاده‌سازی مخزن را در سرویس کانتینر لاراول ثبت کنیم تا بتوانیم آن را به کنترلر تزریق کنیم. برای این کار، از یک سرویس پروایدر استفاده می‌کنیم.

می توانید با دستور زیر یک پروایدر ایجاد کنید:
php artisan make:provider RepositoryServiceProvider 


و درون آن:
// app/Providers/RepositoryServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\UserRepository;

class RepositoryServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
}
}



سپس این سرویس پروایدر را به لیست پروایدرهای اپلیکیشن اضافه می‌کنیم:

// bootstrap/providers.php
return [
App\Providers\AppServiceProvider::class,
App\Providers\RepositoryServiceProvider::class,
];



حالا می‌توانیم این مخزن را به کنترلر تزریق کنیم:
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Repositories\UserRepositoryInterface;

class UserController extends Controller {
protected $userRepository;

public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}

public function index() {
$users = $this->userRepository->all();
return view('users.index', compact('users'));
}
}



در این مثال، کلاس UserController وابستگی خود را به UserRepositoryInterface از طریق کانستراکتور دریافت می‌کند. لاراول به صورت خودکار پیاده‌سازی صحیح را از طریق سرویس کانتینر تزریق می‌کند.

#laravel #فصل_۲
@AmirhDeveloper
.
111🔥1
فصل سه - Views

بخش اول - موتور قالب‌سازی Blade


موتور قالب‌سازی Blade یک سیستم قالب‌سازی ساده و انعطاف‌پذیر است که به صورت پیش‌فرض در فریم‌ورک لاراول استفاده می‌شود. این موتور قالب‌سازی به شما امکان می‌دهد تا با استفاده از سینتکس ساده و تمیز، قالب‌های وب‌سایت خود را طراحی و مدیریت کنید. در ادامه به توضیح کامل اجزای مختلف و امکانات موتور قالب‌سازی Blade می‌پردازیم:

فایل‌های Blade با پسوند .blade.php شناخته می‌شوند و معمولاً در دایرکتوری resources/views قرار می‌گیرند. به عنوان مثال:

resources/views/welcome.blade.php



بخش دوم - ساختار و سینتکس Blade


‏Blade از سینتکس ساده‌ای برای جایگذاری داده‌ها و استفاده از دستورالعمل‌های کنترلی استفاده می‌کند.

برای نمایش داده‌ها در قالب Blade از دستور {{ }} استفاده می‌شود. به عنوان مثال:
<h1>Hello, {{ $name }}</h1>


در این مثال، مقدار متغیر $name در مکان مورد نظر جایگذاری می‌شود.

‏Blade‌‏ از دستورات کنترلی مانند شرط‌ها و حلقه‌ها پشتیبانی می‌کند.

برای استفاده از شرط‌ها از دستور @if و @endif استفاده می‌شود:
@if ($age >= 18)
<p>Adult</p>
@else
<p>Child</p>
@endif


همچنین می توان به همین صورت از حلقه ها نیست استفاده کرد:
@foreach ($users as $user)
<p>{{ $user->name }}</p>
@endforeach

@for($i = 0; $i <= 10; $i++)
<p>{{ $i }}</p>
@endfor

@while (true)
<p>I'm looping forever.</p>
@endwhile


‏Blade امکان وراثت قالب‌ها را نیز فراهم می‌کند. این ویژگی به شما امکان می‌دهد تا یک ساختار پایه برای قالب‌های خود تعریف کنید و قالب‌های دیگر را از آن به ارث ببرید.

همچنین امکان تعریف کامپوننت‌های قابل استفاده مجدد را فراهم می‌کند. به عنوان مثال، شما می‌توانید یک کامپوننت برای نمایش کارت‌های کاربر تعریف کنید.

شما می‌توانید داده‌هایی را که در تمام قالب‌ها به صورت مشترک استفاده می‌شوند، از طریق Service Provider ها به اشتراک بگذارید.
// app/Providers/AppServiceProvider.php
public function boot()
{
View::share('key', 'value');
}

// view.blade.php
<p>{{ $key }}</p>


از شرط‌های پیچیده و حلقه‌ها نیز پشتیبانی می‌کند. به عنوان مثال، شما می‌توانید از حلقه‌های تو در تو استفاده کنید:
@foreach ($users as $user)
<h2>{{ $user->name }}</h2>
@foreach ($user->posts as $post)
<p>{{ $post->noscript }}</p>
@endforeach
@endforeach


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

موتور قالب‌سازی Blade یک ابزار قدرتمند و انعطاف‌پذیر برای مدیریت قالب‌های وب‌سایت‌ها در فریم‌ورک لاراول است. با استفاده از سینتکس ساده و قابلیت‌های گسترده‌ای که ارائه می‌دهد، می‌توانید قالب‌های پویا و قابل توسعه‌ای ایجاد کنید.

#laravel #فصل_۳
@AmirhDeveloper
.
81👍1
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت اول


همانطور که در قسمت های قبل گفته شد View ها یا فایل های نمایشی مثل فایل های HTML در پوشه resources/views قرار می گیرند و فرمت آنها .blade.php می باشد.
با اجرای دستور زیر می توانید یک فایل view ایجاد کنید:
php artisan make:view greeting


دستور بالا یک فایل با فرمت .blade.php را در مسیر resources/views با نام greeting ایجاد می کند. همچنین می توانید این عمل را به صورت دستی انجام دهید.

در لاراول به واسطه موتور قالب سازی Blade به جای نوشتن مستقیم کد های PHP از دستورات Blade استفاده می کنیم تا ساختار تمیزتر، ساده تر و خواناتری داشته باشیم.

در ادامه با دستورات Blade آشنا می شویم:

1- دستور {{ x }} و {!! x !!}

از {{ }} برای چاپ محتوای متغیرها و داده‌ها در فایل‌های قالب استفاده می‌شود. این نوع استفاده معمولاً برای جلوگیری از حملات XSS (Cross-Site Scripting) است و محتوای داخل {{ }} به صورت امن نمایش داده می‌شود.
<h1>Hello, {{ $name }}!</h1>


م.تور Blade به صورت پیش‌فرض داده‌های داخل {{ }} را escape می‌کند. این به این معنی است که هر محتوایی که شامل کاراکترهای ویژه HTML باشد به صورت امن نمایش داده می‌شود.
اگر می‌خواهید داده‌ای را بدون escape کردن نمایش دهید، می‌توانید از سه علامت تعجب {{{ }}} یا تابع {!! !!} استفاده کنید. اما باید خیلی مراقب باشید که این نوع استفاده ممکن است منجر به حملات XSS شود اگر داده‌ها به درستی اعتبارسنجی نشده باشند.
<h1>Hello, {!! $name !!}!</h1>


همچنین می توانید خروجی توابع را نیز نمایش دهید:
<p>The current UNIX timestamp is {{ time() }}.</p>


2- دستورات if، elseif، else، unless

دستورات بالا همانند دستورات شرطی PHP عمل میکنند.
@if ($user->isAdmin())
<p>Welcome, admin!</p>
@elseif ($user->isModerator())
<p>Welcome, moderator!</p>
@else
<p>Welcome, user!</p>
@endif


دستور @unless برای اجرای یک بلوک کد در صورتی که یک شرط برقرار نباشد، استفاده می‌شود. این دستور معکوس دستور @if است.
@unless ($user->isGuest())
<p>Welcome back, {{ $user->name }}!</p>
@endunless


3- دستورات isset و empty
این دستورات برای بررسی خالی بود یا تعریف شدن یک مقدار استفاده می شوند همانند توابع همان آنها در PHP.
@isset($records)
// $records is defined and is not null...
@endisset

@empty($records)
// $records is "empty"...
@endempty


4- دستورات auth و guest
برای نمایش یا عدم نمایش محتوا بر اساس وضعیت احراز هویت (authentication) کاربر استفاده می‌شوند. این دستورات به شما امکان می‌دهند تا به سادگی محتوای خاصی را برای کاربران احراز هویت شده یا کاربران مهمان (غیر احراز هویت شده) نمایش دهید.
@auth
// The user is authenticated...
@endauth

@guest
// The user is not authenticated...
@endguest


همچنین این دو دستور پارامتری که نام گارد احراز هویت می باشد را نیز دریافت میکنند تا به وسیله آن وضعیت احراز هویت را بررسی کنند.
در فصل های مربوطه با گارد ها آشنا می شویم.
@auth('admin')
...
@endauth

@guest('admin')
...
@endguest


5- دستورات switch case
این دستورات نیز همانند switch case در PHP هستند:
@switch($i)
@case(1)
First case...
@break

@case(2)
Second case...
@break

@default
Default case...
@endswitch


6- حلقه ها
حلقه ها در Blade نیز مانند حلقه ها در PHP نوشته می شوند:
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor

@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach

@while (true)
<p>I'm looping forever.</p>
@endwhile


دستور جدیدی با نام forelse وجود دارد تا در صورت خالی بودن متغیر شرط دیگری اجرا شود.
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>No users</p>
@endforelse


7- دستورات continue و break
این دستورات برای کنترل حلقه ها استفاده می شوند، همچنین می توانند یک شرط برای ورودی دریافت کنند و در صورت برقرار بودن شرط اجرا شوند:
@foreach ($users as $user)
@continue($user->type == 1)

<li>{{ $user->name }}</li>

@break($user->number == 5)
@endforeach


#laravel #فصل_۳
@AmirhDeveloper
.
71👍1
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت دوم


1- دستور include:
این دستور برای درج یک ویو (view) دیگر در ویوی فعلی استفاده می‌شود، و محتویات یک فایل را درون فایل دیگر قرار می دهد.
<body>
@include('partials.header')
</body>


اگر فایل partials/header.blade.php وجود داشته باشد، محتویات آن در محل استفاده از @include درج خواهد شد.

2- دستور includeIf:
این دستور همانند @include عمل می‌کند، با این تفاوت که اگر ویو مورد نظر وجود نداشته باشد، خطایی رخ نمی‌دهد و دستور به سادگی نادیده گرفته می‌شود.
<body>
@includeIf('partials.header')
</body>


3- دستور includeWhen:
این دستور برای درج یک ویو در شرایط خاص استفاده می‌شود. این دستور دو پارامتر می‌گیرد: یک شرط و نام ویو.
// $showHeader = true;
<body>
@includeWhen($showHeader, 'partials.header')
</body>


4- دستور includeUnless:
این دستور برعکس @includeWhen عمل می‌کند، یعنی ویو را زمانی درج می‌کند که شرط برقرار نباشد.
// $hideHeader = false;
<body>
@includeUnless($hideHeader, 'partials.header')
</body>


5- دستور includeFirst:
این دستور برای درج اولین ویو موجود در لیست ویوهای داده شده استفاده می‌شود. این دستور یک آرایه از نام ویوها را به عنوان پارامتر دریافت می‌کند.
<body>
@includeFirst(['custom.header', 'partials.header'])
</body>


در این مثال، اگر ویوی custom.header وجود داشته باشد، درج می‌شود و اگر وجود نداشته باشد، ویوی partials.header درج می‌شود.

6- دستور section:
این دستور برای تعریف یک بخش (section) از قالب استفاده می‌شود که می‌تواند در قالب اصلی (layout) یا قالب‌های فرزند مورد استفاده قرار گیرد.
@section('content')
<p>This is the content section.</p>
@endsection


این دستور به تنهایی کاربرد ندارد و نیازمند دستور yield نیز می باشد(مورد بعدی).


7- دستور yield
این دستور برای نمایش محتوای یک بخش در قالب اصلی (layout) استفاده می‌شود.
<body>
@yield('content')
</body>


این دستور سکشن content که بالاتر تعریف کرده ایم را نمایش می دهد.

8- دستور sectionMissing:
این دستور بررسی می‌کند که آیا یک section در ویو فعلی تعریف نشده است. اگر آن بخش تعریف نشده باشد، کد داخل sectionMissing اجرا می‌شود. و درصورتی که تعریف شده باشد محتوای sectionMissing نادیده گرفته می شود و محتوای section نمایش داده می شود.
@sectionMissing('sidebar')
<div class="sidebar">
<p>This is the default sidebar content.</p>
</div>
@endsectionMissing


9- دستور hasSection:
این دستور بررسی می‌کند که آیا یک section مشخص در ویو فعلی تعریف شده است یا نه. این دستور به شما امکان می‌دهد که بر اساس وجود یا عدم وجود یک بخش، رفتار خاصی را در قالب خود اعمال کنید.
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
@endif


10- دستور extends:
این دستور برای تعریف اینکه یک ویو از کدام قالب (layout) ارث‌بری می‌کند استفاده می‌شود.
// resources/views/welcome.blade.php
@extends('layouts.app') //layouts/app.blade.php

@section('header')
<h1>Header Section in Child View</h1>
@endsection


این دستور برای ارث‌بری از قالب اصلی استفاده شده است. سپس با استفاده از دستورات section، محتوای هر بخش در قالب اصلی که از آن ارث بری شده جایگذاری شده است.
در واقع یک فایل مادر وجود دارد که در فایل های فرزند extends می شود و گسترش می یابد.
نمایی از فایل layouts/app.blade.php یا همان فایل مادر:
// resources/views/layouts/app.blade.php
<body>
<header>
@yield('header')
</header>
</body>


همانطور که مشخص است، yield سکشن header در فایل مادر انجام شده در صورتی که سکشن header در فایل فرزند تعریف شده و با استفاده از extends فایل مادر در فایل فرزند، هر دو به هم مرتبط شده اند.

11- دستور show:
این دستور برای پایان دادن به یک بخش و همزمان نمایش محتوای آن استفاده می‌شود. این دستور معمولاً زمانی استفاده می‌شود که بخشی از قالب بخواهد محتوای بخش خود را قبل از پایان قالب فعلی نمایش دهد.
@section('sidebar')
<p>This is the sidebar.</p>
@show


#laravel #فصل_۳
@AmirhDeveloper
.
81👍1
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت سوم


1- دستور csrf:
این دستور برای تولید یک توکن CSRF استفاده می‌شود که به محافظت از فرم‌های شما در برابر حملات CSRF کمک می‌کند.
<form method="" action="">
@csrf
...
</form>


2- دستور method:
این دستور برای تعریف متد HTTP فرم‌ها در صورت استفاده از روش‌های غیر از GET و POST مانند PUT یا DELETE استفاده می‌شود.
<form method="POST" action="">
@csrf
@method('PUT')
...
</form>



3- دستور error:
این دستور برای نمایش پیام‌های خطا استفاده می‌شود. معمولاً در فرم‌ها برای نمایش خطاهای اعتبارسنجی به کار می‌رود.
<form method="POST" action="">
@csrf
@error('name')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</form>


4- دستور use:
این دستور برای use کردن کلاس ها، کانستنت ها و... استفاده می شود.
@use('App\Models\Flight')


5- دستور php:
این دستور برای اجرای کد PHP درون قالب Blade استفاده می‌شود.
@php
$name = 'John Doe';
@endphp
<p>Hello, {{ $name }}</p>


6- دستور env:
این دستور برای بررسی محیط فعلی برنامه استفاده می‌شود.
@env('local')
<p>You're in the local environment.</p>
@endenv


7- دستور production:
این دستور به شما امکان می‌دهد تا کدهایی را فقط در محیط تولید اجرا کنید.
@production
<p>This code runs only in the production environment.</p>
@endproduction


8- دستور verbatim:
این دستور برای جلوگیری از پردازش دستورات Blade در داخل بلوک‌های HTML استفاده می‌شود.
@verbatim
<div class="example">
This is a Blade directive: {{ $name }}
</div>
@endverbatim


کد های درون این دستور توسط Blade تفسیر نخواهند شد و به همان شکل نمایش داده می شوند.
همچنین با قرار دادن یک @ اضافه قبل از دستورات Blade از تفسیر آن ها جلوگیری می شود:
@@if()

// HTML Output:
@if()


9- دستور fragment:
این دستور به شما امکان می‌دهد که یک بخش از کد را در یک نام خاص بسته‌بندی کنید و در جای دیگر فقط آن قطعه را رندر کنید.
// Blade File:
@fragment('user-list')
<ul>
<li>Item 1</li>
</ul>
@endfragment

// Controller File:
return view('dashboard'])->fragment('user-list');


10- دستورات disk، elsedisk، unlessdisk:
این دستور برای اجرای یک بلوک کد تنها در صورتی که دیسک مشخص شده موجود باشد استفاده می‌شود.
@disk('s3')
<p>The S3 disk is available.</p>
@elsedisk
<p>The S3 disk is not available.</p>
@enddisk

@unlessdisk('local')
<p>The local disk is not available.</p>
@endunlessdisk


#laravel #فصل_۳
@AmirhDeveloper
.
61🔥1
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت چهارم


1- دستور once:
این دستور برای تنها یک بار اجرای محتوای داخل آن استفاده می‌شود. حتی اگر در یک حلقه باشد، محتوای آن تنها یک بار اجرا می‌شود.
@once
<p>This will be displayed only once.</p>
@endonce


2- دستور stack:
برای نمایش محتوای انباشته شده در یک بخش خاص با استفاده از دستور @push.
<head>
@stack('noscripts')
</head>


3- دستور push:
برای افزودن محتوایی به یک بخش خاص استفاده می‌شود. این محتوا در بخش تعریف شده با دستور @stack نمایش داده می‌شود.
// Childe File:
@push('noscripts')
<noscript src="/example.js"></noscript>
@endpush

// Parent File:
<head>
@stack('noscripts')
</head>


4- دستور pushOnce:
مشابه @push است اما تضمین می‌کند که محتوای اضافه شده تنها یک بار نمایش داده شود، حتی اگر چندین بار @pushOnce استفاده شده باشد.
@pushOnce('noscripts')
<noscript src="/example.js"></noscript>
@endpushOnce


5- دستور pushIf:
ترکیبی از @push و شرایط است که اگر شرط برقرار باشد، محتوای آن به بخش مربوطه اضافه می‌شود.
@pushIf($condition, 'noscripts')
<noscript src="/example.js"></noscript>
@endpushIf


6- دستور prepend:
برای اضافه کردن محتوای جدید به ابتدای یک بخش خاص.
// Childe File:
@prepend('noscripts')
<noscript src="/first.js"></noscript>
@endprepend

// Parent File:
<head>
@stack('noscripts')
</head>


7- دستور inject:
برای تزریق یک سرویس یا متغیر به یک نمای Blade.
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}
</div>


8- دستور each:
برای رندر کردن یک نما برای هر آیتم در یک مجموعه.
@each('view.name', $items, 'item', 'view.empty')

‏view.name : نمایی که باید برای هر آیتم رندر شود.
‏$items : مجموعه‌ای از آیتم‌ها.
‏item : نام متغیری که هر آیتم به آن ارجاع داده می‌شود.
view.empty : نمایی که باید نمایش داده شود اگر مجموعه خالی باشد.

9- دستور required:
برای تنظیم ویژگی required یک عنصر HTML به صورت شرطی.
<input type="text" name="name" @required(true)>


10- دستور readonly:
برای تنظیم ویژگی readonly یک عنصر HTML به صورت شرطی.
<input type="text" name="name" @readonly(true)>


11- دستور disabled:
برای تنظیم ویژگی disabled یک عنصر HTML به صورت شرطی.
<button type="submit" @disabled(true)>Submit</button>


12- دستور selected:
برای تنظیم ویژگی selected یک گزینه در یک منوی انتخابی به صورت شرطی.
<select name="options">
<option value="1" @selected($value == 1)>Option 1</option>
<option value="2" @selected($value == 2)>Option 2</option>
</select>


13- دستور checked:
برای تنظیم ویژگی checked یک چک‌باکس یا رادیو باتن به صورت شرطی.
<input type="checkbox" name="agree" @checked(true)>


14- دستور style:
برای اضافه کردن ویژگی style به یک عنصر HTML به صورت شرطی یا بدون شرط.
// conditional
<div @style(['display: none' => $isHidden])>
Content
</div>

// unconditionally
<div @style(['display: none'])>
Content
</div>


15- دستور class:
برای اضافه کردن کلاس CSS به یک عنصر HTML به صورت شرطی یا بدون شرط.
// conditional
<div @class(['hidden' => $isHidden])>
Content
</div>

// unconditionally
<div @class(['hidden'])>
Content
</div>

#laravel #فصل_۳
@AmirhDeveloper
.
9👍1🔥1
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت اول


کامپوننت‌ها، ابزارهایی قدرتمند برای تسهیل توسعه رابط کاربری (UI) در برنامه‌های وب هستند. کامپوننت‌ها به شما این امکان را می‌دهند که بخش‌های کوچکی از رابط کاربری را به صورت مجزا ایجاد و مدیریت کنید، که این باعث می‌شود کدهای شما تمیزتر و قابل نگهداری‌تر باشند.

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

کامپوننت‌ها در لاراول معمولاً از دو بخش تشکیل می‌شوند:
1- بخش HTML: که ساختار رابط کاربری را تعریف می‌کند.
2- بخش منطقی (Logic): که می‌تواند شامل متدها و داده‌هایی باشد که برای تولید HTML مورد نیاز است. این بخش به طور معمول در کلاس‌های PHP تعریف می‌شود.

کامپوننت‌ها می‌توانند به سادگی در فایل‌های Blade فراخوانی شوند. برای مثال، اگر یک کامپوننت به نام alert دارید، می‌توانید آن را به این صورت فراخوانی کنید:
<x-alert type="danger" :message="This is a danger alert" />


این فراخوانی، کامپوننت مربوطه را به همراه داده‌هایی که به آن ارسال شده است، در صفحه نمایش می‌دهد.

لاراول دو نوع کامپوننت ارائه می‌دهد:
کامپوننت‌های کلاس محور (Class-based Components) و کامپوننت‌های بدون کلاس (Anonymous Components).
کامپوننت‌های کلاس محور شامل یک فایل PHP کلاس برای مدیریت منطق هستند، در حالی که کامپوننت‌های بدون کلاس تنها به یک فایل Blade برای نمایش متکی هستند و منطق پیچیده‌ای ندارند.

برای ساخت کامپوننت های کلاس محور میتوان از دستور زیر استفاده کرد:
php artisan make:component Alert


این دستور یک کامپوننت با نام Alert ایجاد می کند که شامل یک کلاس در app/View/Components و یک فایل View در resources/views/components می باشد.

برای ساخت کامپوننت های بدون کلاس یا ناشناس می توانید از دستور زیر استفاده کنید:
php artisan make:component input --view


این دستور تنها یک فایل View در resources/views/components ایجاد می کند.

همچنین می توانید کامپوننت ها را در فولدر های تو در تو ایجاد کنید:
# Class-based Components
php artisan make:component Forms/Input
# app/View/Components/Forms/Input.php
# resources/views/components/forms/input.blade.php

# Anonymous Components
php artisan make:component forms.input --view
# resources/views/components/forms/input.blade.php


همچنین برای فراخوانی کامپوننت از فولدر های خاص:
<x-forms.input />


حال که کامپوننت خود را ایجاد کرده اید، کافی است کد های HTML خود را درون فایل View کامپوننت بنویسید و با فراخوانی کاپوننت آنها را نمایش دهید:
// resources/views/components/alert.blade.php
<div class="alert alert-success">
This is an alert componnet!
</div>


و برای فراخوانی آن:
// Another View file in another world
<x-alert />



#laravel #فصل_۳
@AmirhDeveloper
102👍1
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت دوم


ارسال داده‌ها و متغیرها به کامپوننت‌ها برای پویا سازی آنها بسیار مهم است.

برای این کار کافی است درون فایل View کامپوننت خود متغییر ها را چاپ کنیم:
// resources/views/components/alert.blade.php
<div class="alert alert-{{ $type }}">
{{ $message }}
</div>


برای مقدار دهی متغیر های type و message در هنگام فراخوانی کامپوننت می توانید به صورت اتریبیوت های HTML پاس بدهیم:
<x-alert type="success" message="Your operation was successful!" />


در اینجا، مقادیر type و message به متغیرهای تعریف‌شده در کامپوننت ارسال می‌شوند و در نهایت، HTML تولید شده و در صفحه نمایش داده می‌شود.
در مثال بالا داده های استاتیک قابل ارسال است.
برای ارسال متغیر باید به روش زیر عمل کنید:

<x-alert :type="$alertType" :message="$alertMessage" />


علامت : قبل از نام متغیرها به این معناست که داده‌ها به عنوان متغیرهای PHP ارسال می‌شوند نه به عنوان رشته ثابت. متغیرهای $alertType و $alertMessage می‌توانند از کنترلر یا جای دیگری در ویو شما باشند.

درصورتی که از کامپوننت های کلاس محور استفاده می کنید می توانید این متغییر ها را درون کلاس نیز داشته باشید، برای این کار کافی است متغیر ها را به صورت پراپرتی بنویسید و در کانستراکتور مقدار دهی کنید:
namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
public $type;
public $message;

public function __construct($type, $message)
{
$this->type = $type;
$this->message = $message;
}

public function render()
{
return view('components.alert');
}
}


در مثال بالا متغیر ها از طریق پراپرتی های تعریف شده در دسترس قرار دارند.

در حالت عادی تگ های کاپوننت ها نیاز به باز و بسته شدن ندارند، اما نیز می توانید آنها را باز و بسته کنید و میان آنها تگ ها یا داده های دیگری را بنویسید.
اسلات پیش‌فرض در واقع محتوا یا بخشی از HTML است که به طور مستقیم بین تگ‌های کامپوننت در ویو تعریف می‌شود و سپس در کامپوننت نمایش داده می‌شود.
محتوای بین تگ های کامپوننت از طریق متغیر $slot در فایل ویو در دسترس هستند.
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>


در اینجا {{ $slot }} به عنوان اسلات پیش‌فرض عمل می‌کند. یعنی محتوایی که به این کامپوننت ارسال می‌شود، در جایگاه {{ $slot }} قرار می‌گیرد.

حالا می‌توانید این کامپوننت را در یک ویو دیگر به این شکل استفاده کنید:
<x-alert type="warning">
This is a warning alert!
</x-alert>


در این مثال، متن "This is a warning alert!" به عنوان اسلات پیش‌فرض در مکان {{ $slot }} قرار می‌گیرد و خروجی HTML به صورت زیر خواهد بود:
<div class="alert alert-warning">
This is a warning alert!
</div>


اسلات‌های نام‌گذاری شده به شما امکان می‌دهند که بخش‌های مختلف یک کامپوننت را از طریق اسلات‌های مختلف پر کنید. این ویژگی زمانی مفید است که کامپوننت شما نیاز به دریافت چندین بخش محتوا داشته باشد.
<div class="card">
<div class="card-header">
{{ $header }}
</div>
<div class="card-body">
{{ $slot }}
</div>
</div>


در اینجا، {{ $header }} یک اسلات نام‌گذاری شده است و {{ $slot }} به عنوان اسلات پیش‌فرض برای محتوای اصلی استفاده می‌شود.
برای استفاده از این کامپوننت، شما می‌توانید به این صورت عمل کنید:
<x-card>
<x-slot:header>
Card Title
</x-slot>
This is the card content.
</x-card>


در این مثال:
مقدار "Card Title" به عنوان محتوای اسلات نام‌گذاری شده header به کامپوننت ارسال می‌شود.
و مقدار "This is the card content." به عنوان محتوای پیش‌فرض درون اسلات پیش‌فرض ({{ $slot }}) قرار می‌گیرد.

نامگذاری متغیر های ورودی:
نام متغیر های درون کامپوننت باید به صورت cameCase نوشته شوند:
<div class="alert alert-{{ $alertType }}">
{{ $slot }}
</div>


و نام اتریبیوت ورودی باید به صورت kebab-case نوشته شود:
<x-alert :alert-type="$alertType">
Alert
</x-alert>


درصورتی که نام متغیر درون کامپوننت با نام متغیری که باید به کامپوننت پاس داده شود برابر باشد می توانید آن را به صورت کوتاه شده بنویسید:
<x-alert :$alertType>
Alert
</x-alert>


گاهی ممکن است ورودی های ما با دستورات Blade به تداخل بخورد، برای escape کردن آن تنها کافی است از دو عبارت :: استفاده کنید تا توسط Blade رندر نشوند:
<x-button ::class="{ danger: isDeleting }">
Submit
</x-button>


#laravel #فصل_۳
@AmirhDeveloper
.
8👍21
توی آپدیت بعدی LaraGram قابلیت های کاربردی و مهمی رو خواهیم داشت.

از جمله Group Listener ها:
- می تونید با استفاده از اون ها یک سری شروط رو روی یک گروه از لیسنر ها اعمال کنید.

به عنوان مثال:

- پیام های درون چه اسکوپی پردازش بشن (گروه، کانال یا پیوی ربات)
- یا پیام های کاربران با چه سطح دسترسی پردازش بشه.(مالک، مدیر یا عضو عادی)

- همچنین middleware ها هم قراره اضافه بشن تا شروط خودتون رو بنویسید و روی یک گروه از لیسنر ها اعمال کنید.

- کنترلر ها هم به LaraGram اضافه میشن تا لیسنر ها توی یک فایل مجزا نوشته بشن و منطق ربات توی فایل های کنترلر خاص خودشون، تا از شلوغ شدن فایل ها جلوگیری بشه.

- پشتیبانی از OpenSwoole اضافه شده و گزینه پیشنهادی هست از اونجایی که LaraGram میتونه سنگین باشه.

- همچنین Conversation ها که قبل تر معرفی کرده بودیم هر اضافه میشن تا بدون هیچ دردسری یک گفت و گو بین ربات و کاربر ایجاد کنید.

- متد های جدیدی به سیستم کیبورد بیلدر اضافه شده.
- قابلیت اجرا کامند های کنسول از طریق کد.

- و چند لیسنر جدید:
onList()
onArray()
onAddMember()
onJoinMember()
onMention()
onHashtag()


- و احتمالا چیزای دیگه....

📱 LaraGram - Laraquest - Core

🔎 #laragram
@AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥82👍1
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت سوم


ویژگی $attributes به طور خودکار تمامی ویژگی‌های اضافی‌ای که به یک کامپوننت Blade پاس داده می‌شوند را مدیریت می‌کند.
این ویژگی شامل متدهای متعددی برای کار با اتریبیوت ها می‌شود.

1- متد merge:
این متد به شما اجازه می‌دهد که ویژگی‌های جدیدی را به مجموعه ویژگی‌های موجود اضافه کنید و در صورت وجود ویژگی‌های تکراری، آن‌ها را ادغام کنید. معمولاً برای کلاس‌های CSS استفاده می‌شود.
<div {{ $attributes->merge(['class' => 'alert alert-' . $type]) }}>
{{ $slot }}
</div>


اگر کلاس‌های CSS به این کامپوننت پاس داده شوند، merge آن‌ها را با کلاس‌های پیش‌فرض ترکیب می‌کند. برای مثال:
<x-alert type="success" class="my-custom-class">
Success!
</x-alert>


کلاس نهایی ترکیب شده به صورت alert alert-success my-custom-class خواهد بود.

2- متد class:
این متد به طور خاص برای کار با کلاس‌های CSS استفاده می‌شود. شما می‌توانید کلاس‌های جدیدی اضافه کنید یا کلاس‌های موجود را با شرط‌هایی مدیریت کنید.
<div {{ $attributes->class(['alert', 'alert-' . $type, 'font-bold' => $isBold]) }}>
{{ $slot }}
</div>


اگر $isBold مقدار true داشته باشد، کلاس font-bold اضافه می‌شود.

3- متد prepend:
این متد برای افزودن ویژگی‌های جدید به ابتدا (اولویت) مجموعه ویژگی‌های موجود استفاده می‌شود. اگر ویژگی مورد نظر قبلاً موجود باشد، مقدار جدید در ابتدا اضافه می‌شود.
<div {{ $attributes->prepend('class', 'font-bold') }}>
{{ $slot }}
</div>


اگر کامپوننت قبلاً دارای کلاس font-bold نباشد، به ابتدای لیست کلاس‌ها اضافه می‌شود.

4- متد filter:
این متد به شما اجازه می‌دهد که ویژگی‌ها را بر اساس یک شرط فیلتر کنید.
<div {{ $attributes->filter(fn ($value, $key) => $key === 'class' || $key === 'id') }}>
{{ $slot }}
</div>


در این مثال، فقط ویژگی‌های class و id نگه داشته می‌شوند و سایر ویژگی‌ها فیلتر می‌شوند.

5- متد whereStartsWith:
این متد ویژگی‌هایی را که کلید آن‌ها با رشته خاصی شروع می‌شود، فیلتر می‌کند.
<div {{ $attributes->whereStartsWith('data-') }}>
{{ $slot }}
</div>


این کد تمام ویژگی‌هایی که با data- شروع می‌شوند را به div اضافه می‌کند.

6- متد whereDoesntStartWith:
این متد ویژگی‌هایی که کلید آن‌ها با رشته خاصی شروع نمی‌شود را فیلتر می‌کند.
<div {{ $attributes->whereDoesntStartWith('wire:') }}>
{{ $slot }}
</div>


این کد تمام ویژگی‌هایی که با wire: شروع نمی‌شوند را نگه می‌دارد.

7- متد has:
این متد بررسی می‌کند که آیا یک ویژگی خاص در مجموعه ویژگی‌ها وجود دارد یا خیر.
@if ($attributes->has('class'))
<div {{ $attributes }}>
{{ $slot }}
</div>
@else
<div class="default-class">
{{ $slot }}
</div>
@endif


این کد بررسی می‌کند که آیا ویژگی class وجود دارد و در صورت عدم وجود، یک کلاس پیش‌فرض استفاده می‌کند.

8- متد hasAny:
این متد بررسی می‌کند که آیا هر یک از ویژگی‌های مورد نظر در مجموعه وجود دارند یا خیر.
@if ($attributes->hasAny(['class', 'id']))
<div {{ $attributes }}>
{{ $slot }}
</div>
@endif


این کد بررسی می‌کند که آیا یکی از ویژگی‌های class یا id وجود دارند و در صورت وجود، div را با آن‌ها رندر می‌کند.

9- متد get:
این متد مقدار یک ویژگی خاص را برمی‌گرداند. اگر ویژگی وجود نداشته باشد، می‌توانید یک مقدار پیش‌فرض برای آن تعیین کنید.
<div id="{{ $attributes->get('id', 'default-id') }}">
{{ $slot }}
</div>


در اینجا، اگر ویژگی id پاس داده نشده باشد، مقدار پیش‌فرض default-id استفاده می‌شود.

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

🔎 #laravel #فصل_۳
@AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
61👍1
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت چهارم


درصورتی که یک پکیج توسعه می دهید که شامل چندین کامپوننت می باشد، می توانید به صورت زیر آن را در پروژه ها لود کنید:

ابتدا در یک پروایدر مانند App\Providers\AppServiceProvider.php درون متد boot یک نیم اسپیس را به پکیج خود اختصاص می دهید:
public function boot(): void
{
Blade::componentNamespace('Nightshade\\Views\\Components', 'nightshade');
}


در مثال بالا nightshade برابر با نیم اسپیس داده شده می باشد.
و سپس برای استفاده:
<x-nightshade::calendar />


کامپوننت calendar از نیم اسپیس nightshade که در پروایدر تعریف کرده ایم فراخوانی خواهد شد.

متد های داینامیک:

علاوه بر داینامیک بودن متغیر ها در views، متد ها نیز قابل استفاده هستند:
شما میتوانید درون کلاس کامپوننت خود یک متد را تعریف کنید و به صورت invoke درون view استفاده کنید:
public function isSelected(string $option): bool
{
return $option === $this->selected;
}


برای استفاده:
<option {{ $isSelected($value) ? 'selected' : '' }} value="{{ $value }}">
{{ $label }}
</option>


کامپوننت های خطی یا inline:
درصورتی که یک کامپوننت خیلی کوچک نیاز دارید میتوانید با دستور زیر یک کاپوننت اینلاین ایجاد کنید.
php artisan make:component Alert --inline


این کامپوننت ها تنها از یک کلاس تشکیل شده اند و فایل view ندارند.
کافی است درون متد render کد های HTML خود را قرار دهید:
    public function render(): View|Closure|string
{
return <<<'blade'
<div>
</div>
blade;
}


دستورات Blade سفارسی:

گاهی نیاز است دستورات Blade خود را پیاده سازی کنیم، در ادامه به متد های آن می پردازیم.
تمامی متد ها از فساد Blade قابل دسترس هستند.

1- متد directive:
این متد برای تعریف یک دایرکتیو سفارشی استفاده می‌شود. شما می‌توانید یک دایرکتیو سفارشی با نام دلخواه خود ایجاد کنید که در قالب‌های Blade قابل استفاده باشد.
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});


برای استفاده:
@datetime($post->created_at)


2- متد if:
این متد برای ایجاد دایرکتیوهای شرطی (conditional directives) استفاده می‌شود. این دایرکتیوها به شما امکان می‌دهند تا شرط‌های پیچیده را به صورت خواناتر و ساده‌تر در قالب‌های Blade بنویسید.
use Illuminate\Support\Facades\Blade;

Blade::if('admin', function () {
return isAdmin(); // isAdmin() not a valid function
});


برای استفاده:
@admin
<p>You are an admin.</p>
@else
<p>You are not an admin.</p>
@endadmin


3- متد component:
این متد به شما امکان می‌دهد تا یک کامپوننت کلاس Blade یا یک ویوی Blade را به یک دایرکتیو خاص متصل کنید.
Blade::component('alert', 'components.alert');


برای استفاده:
@alert(['type' => 'danger'])
This is a warning alert!
@endalert


4- متد include:
این متد برای تعریف یک دایرکتیو سفارشی که یک ویوی خاص را شامل می‌شود، استفاده می‌شود. این روش بسیار مشابه استفاده از @include است اما با دایرکتیو خاص خودتان.
Blade::include('components.alert', 'alert');


برای استفاده:
@alert(['type' => 'danger'])
This is a warning alert!
@endalert


#laravel #لاراول #فصل_۳
@AmirhDeveloper
.
102👍1
Media is too big
VIEW IN TELEGRAM
فاجعه ربات های چت ناشناس...

https://youtu.be/1sZprSWgEsw?si=xyaHu4OINQ41NmJV


@MahdiyarDev
اکثر افراد اطلاعی ندارند که بخش عمده‌ای از این ربات‌های مدیریت گروه و ربات‌‌های این‌چنینی (مثل دیجی‌آنتی، همین ربات ناشناس و امثال‌اشون) که به‌طور معمول رایگان و فراگیر هستند هم عملا درآمد اصلیشون از فروش اطلاعات هست، چه اطلاعاتی؟ این که فلان یوزر در چه گروه‌هایی عضو هست، کیِ و کجا چه پیام‌هایی داده، با چه‌کسانی در ارتباط هست و ازین دسته اطلاعات. که حالا به سازمان‌های مختلف و دولت یا تحت عنوان ربات‌هایی که در ازای n مقدار اعتبار به‌طور مثال به شما میگن فلان یوزر توی چه گروه‌هایی عضو هست (همچین سرویس‌ای وجود داره)، فروخته می‌شه.



@LearnWithZmat24
دوستان هرچی هم بشه مهم اینه که اگاهی داشته باشن مردم

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

خیلی از این مشکلات از عدم آگاهی افراد میان. هرجا شخص یا اسخاص ثالث وسط میان قضیه دارک میشه



@AmirhDeveloper
.
84👍1🗿1
فصل چهار - مدل‌ها و Eloquent ORM

بخش اول - معرفی Eloquent

الوکوئنت (Eloquent) یکی از بخش‌های مهم و قدرتمند فریمورک لاراول است که به عنوان ORM (Object-Relational Mapping) عمل می‌کند. ORM یک تکنیک برنامه‌نویسی است که به توسعه‌دهندگان اجازه می‌دهد تا با پایگاه داده به صورت شیء‌گرا کار کنند و جداول پایگاه داده را به کلاس‌های PHP تبدیل کنند.

کارکرد اصلی الوکوئنت:
الکوئنت به شما امکان می‌دهد تا با استفاده از مدل‌های شیء‌گرا (Objects)، داده‌های پایگاه داده را دستکاری کنید. این به شما اجازه می‌دهد که به جای نوشتن کوئری‌های SQL خام، از متدهای شیء‌گرای الوکوئنت استفاده کنید که کد را تمیزتر و قابل‌فهم‌تر می‌کند.

ویژگی‌ها و قابلیت‌های الوکوئنت:
1- تعریف مدل‌ها: در الوکوئنت، هر جدول پایگاه داده با یک مدل مطابقت دارد. این مدل‌ها کلاس‌هایی هستند که رفتارها و ویژگی‌های مرتبط با جداول پایگاه داده را مشخص می‌کنند. همچنین یکی از سه بخش معماری MVC را تشکیل می دهند.

2- روابط: الوکوئنت به شما امکان می‌دهد تا روابط بین جداول را به راحتی تعریف کنید. برای مثال:

ارتباط یک به یک (One to One).
ارتباط یک به چند (One to Many).
ارتباط چند به چند (Many to Many).
ارتباطات چندشکلی که یک مدل می‌تواند با چندین مدل دیگر مرتبط باشد (Polymorphic).

3- اسکوپ‌های عمومی و محلی: می‌توانید کوئری‌های عمومی که به صورت مکرر استفاده می‌شوند را در مدل تعریف کنید (Global Scopes) یا متدهایی ایجاد کنید که اسکوپ‌های محلی را تعریف کنند (Local Scopes).

4- پیمایشگرها و دسترسی‌گرها (Mutators and Accessors): به شما اجازه می‌دهد تا رفتارهای خاصی را هنگام تنظیم یا گرفتن ویژگی‌های یک مدل اعمال کنید.

5- رخدادها (Events): الوکوئنت دارای سیستم رخدادهایی است که شما می‌توانید به آن‌ها گوش دهید و به ازای رویدادهایی مانند creating, updating, deleting و غیره واکنش نشان دهید.

6- کوئری‌سازی شیء‌گرا (Object-Oriented Querying): الکوئنت به شما اجازه می‌دهد تا به جای استفاده از SQL خام، از متدهای شیء‌گرا برای ایجاد کوئری‌ها استفاده کنید. این کوئری‌ها شامل فیلتر کردن، مرتب‌سازی، گروه‌بندی و سایر عملیات‌های پیچیده می‌شود، بدون اینکه نیازی به نوشتن یک خط SQL باشد.

7- مهاجرت‌ها (Migrations) و بذرها (Seeders): در کنار مدل‌های الوکوئنت، لاراول ابزارهایی برای مدیریت ساختار پایگاه داده (مهاجرت‌ها) و پر کردن جداول با داده‌های نمونه (سیدر و فکتوری) فراهم می‌کند. این ابزارها به توسعه‌دهندگان کمک می‌کنند تا به‌راحتی پایگاه داده‌های خود را ایجاد و مدیریت کنند.

8- پشتیبانی از Eager Loading و Lazy Loading: الکوئنت از دو روش برای بارگذاری داده‌های مرتبط با مدل‌ها پشتیبانی می‌کند:

بارگذاری (Eager): این روش به شما امکان می‌دهد داده‌های مرتبط با یک مدل را همزمان با فراخوانی مدل بارگذاری کنید تا از تعداد کوئری‌های اضافی جلوگیری شود.

بارگذاری (Lazy): این روش زمانی داده‌های مرتبط را بارگذاری می‌کند که به آن‌ها نیاز داشته باشید. این ممکن است منجر به ارسال کوئری‌های اضافی به پایگاه داده شود.

9- پشتیبانی از Soft Deletes: الکوئنت امکان (Soft Delete) را فراهم می‌کند که به جای حذف دائمی یک رکورد، آن را "پنهان" می‌کند تا بعداً بتوان آن را بازیابی کرد. این کار از طریق یک فیلد اضافی در جدول انجام می‌شود که تاریخ و زمان حذف را ثبت می‌کند.

10- و...

مزایا و کاربردهای عملی:

استفاده از الوکوئنت باعث می‌شود که کدها به مراتب خواناتر و قابل نگهداری‌تر باشند.

نیاز به نوشتن کوئری‌های SQL به حداقل می‌رسد و توسعه‌دهنده می‌تواند روی منطق برنامه تمرکز کند.

الوکوئنت با ارائه ابزارهایی برای مدیریت روابط بین جداول، پیچیدگی مدیریت این روابط را به طور چشم‌گیری کاهش می‌دهد.

الوکوئنت برای توسعه‌دهندگانی که از لاراول برای ساخت برنامه‌های وب استفاده می‌کنند، ابزاری ضروری است. این ابزار در تمامی جنبه‌های کار با پایگاه داده از جمله تعریف مدل‌ها، روابط، کوئری‌سازی و حتی مدیریت مهاجرت‌های پایگاه داده (Database Migrations) کاربرد دارد.

در نهایت، الوکوئنت به عنوان یکی از ویژگی‌های برجسته لاراول، یک سطح انتزاعی بسیار قوی برای کار با پایگاه داده‌ها فراهم می‌کند که هم کار را سریع‌تر و هم کدها را تمیزتر و قابل نگهداری‌تر می‌سازد.

در بخش های بعدی با تمام موارد نام برده شده به طور مفصل آشنا خواهیم شد.

▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
@AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
82👍1
🔴 ویژگی‌های جدید در آپدیت‌های اخیر LaraGram:

◀️ سیستم کانفیگ:

این سیستم مشابه لاراول بازطراحی شده.
به جای استفاده از متغیرهای $_ENV، کانفیگ‌ها از طریق فساد Config قابل دسترسی هستند.

◀️ سیستم کش:

⬇️ سیستم کش مشابه لاراول طراحی شده و از چهار درایور پشتیبانی می‌کند:

🔴 درایور File، برای ذخیره‌سازی داده‌ها در فایل (درایور پیش‌فرض).

🔴 درایور Redis، ذخیره‌سازی با استفاده از Redis (نیازمند به اکستنشن redis).

🔴 درایور Database، ذخیره‌سازی در دیتابیس (نیازمند ایجاد جدول cache که مایگریشن آن به‌طور پیش‌فرض در پروژه وجود دارد).

🔴 درایور APCu، برای دخیره سازی در حافظه APC (نیازمند به اکستنشن apcu)

این سیستم به سادگی از فساد Cache در دسترس هست.

◀️متد های دریافت آپدیت Laraquest:

⬇️ دومتد جدید برای دریافت آپدیت های تلگرام اضافه شده:

🔴 متد swoole در کنار openswoole اضافه شده که از قابلیت های زیادی از جمله کوروتین ها پشتیبانی میکنه (نیازمند اکستنشن openswoole یا swoole)
این روش ها معمولا در سرور ها در دسترس هستند و متد های پیشنهادی LaraGram نیز می‌باشند.

🔴 متد polling برای دریافت آپدیت بدون وب هوک اضافه شده که سرعت بالاتری نسبت به وب هوک داره به دلیل بارگذرای پروژه در رم و یکبار لود شدن آن، اما مصرف منابع بیشتری رو دارا هست.

◀️ سایر موارد مربوط به بهینه سازی و رفع ایرادات بوده.

🔴 آپدیت های بعدی:

سیستم Logging برای رصد روند اجرا
سیستم Translator برای ربات چند زبانه
سیستم Timer برای کار با زمان ها
سیستم Caching برای بهینه سازی اجرا
سیستم Conversation برای ایجاد گفت‌گو
بازنویسی اختصاصی الوکوئنت لاراول

🔹
📱 LaraGram
📱 Laraquest
📱 Core
💠@AmirHDeveloper
💠@LaraXGram
🔹
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍32
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت اول


برای ایجاد یک مدل، کافی است دستور زیر اجرا کنید:
php artisan make:model User


این دستور یک فایل جدید به نام User.php در پوشه app/Models ایجاد می‌کند که به شکل زیر است:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
//
}


هر مدل در لاراول به صورت پیش‌فرض به یک جدول پایگاه داده مرتبط است. لاراول با استفاده از قواعد نامگذاری، نام جدول را از نام مدل استخراج می‌کند. به طور مثال، مدل User به جدول users متصل می‌شود.
نام مدل باید به صورت مفرد (User) و نام جدول به صورت جمع (users) باشد.

اگر نام جدول شما متفاوت باشد، می‌توانید آن را به صورت دستی مشخص کنید:
class User extends Model
{
protected $table = 'table_name';
}


لاراول یک ویژگی امنیتی به نام Mass Assignment Protection دارد که به شما اجازه می‌دهد فیلدهایی که می‌توانند به صورت گروهی پر شوند را مشخص کنید. این کار با استفاده از ویژگی $fillable انجام می‌شود:
class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
}


با استفاده از این ویژگی، فقط فیلدهای name، email و password می‌توانند به صورت گروهی پر شوند. این کار مانع از حملات احتمالی امنیتی می‌شود.

از این پس می توانید با استفاده از کلاس User با جدول users ارتباط برقرار کنید.

در این قسمت با متد های اصلی برای عملیات CRUD آشنا می شویم.

1- متد all
متد all تمام رکوردهای یک جدول را برمی‌گرداند. این متد بدون هیچ شرطی، تمامی رکوردها را برمی‌گرداند.

$users = User::all();


این کد تمامی رکوردهای جدول users را برمی‌گرداند. به خاطر داشته باشید که اگر تعداد رکوردها زیاد باشد، استفاده از این متد می‌تواند به عملکرد پایگاه داده آسیب بزند.

2- متد find
متد find برای یافتن یک رکورد بر اساس مقدار کلید اصلی (Primary Key) آن استفاده می‌شود. این متد یک رکورد را به عنوان شیء مدل بازمی‌گرداند یا اگر رکوردی پیدا نشود، مقدار null برمی‌گردد.

$user = User::find(1);


این کد کاربری با id برابر با ۱ را از جدول users پیدا می‌کند.

3- متد where
متد where برای اضافه کردن شرط به پرس و جو استفاده می‌شود. این متد یک یا چند شرط را برای محدود کردن نتایج اعمال می‌کند.

$adultUsers = User::where('age', '>', 18)->get();


این کد تمام کاربرانی که سن آن‌ها بالاتر از ۱۸ سال است را برمی‌گرداند.
می‌توان از چندین شرط where پشت سر هم استفاده کرد:
$filteredUsers = User::where('status', 'active')->where('age', '>', 18)->get();


این کد کاربرانی را برمی‌گرداند که هم فعال هستند و هم سن آن‌ها بالاتر از ۱۸ سال است.
نکته: به طور پیشفرض اگر دو پارامتر به متد where داده شود از اپراتور = استفاده می کند، مگر ذکر شود.

4- متد orWhere
متد orWhere برای اضافه کردن شرط‌های OR به پرس و جو استفاده می‌شود. این متد در جایی به کار می‌رود که می‌خواهیم نتایج با یکی از شرط‌ها تطابق داشته باشند.

$users = User::where('status', 'active')->orWhere('age', '>', 18)->get();


این کد کاربرانی را برمی‌گرداند که یا فعال هستند یا سن آن‌ها بالاتر از ۱۸ سال است.

5- متد get
متد get برای بازیابی مجموعه‌ای از رکوردها با شرایط خاص استفاده می‌شود. این متد بعد از استفاده از یک یا چند متد شرطی (مانند where و غیره) به کار می‌رود و نتایج را به صورت یک Collection برمی‌گرداند.

6- متد delete
متد delete برای حذف یک رکورد یا چندین رکورد از پایگاه داده استفاده می‌شود. برای حذف یک رکورد، ابتدا باید آن را پیدا کرده و سپس متد delete را روی آن اجرا کنیم.
$user = User::find(1)->delete();


این کد کاربری با id برابر با ۱ را از جدول users حذف می‌کند.

7- متد update
متد update برای به‌روزرسانی یک یا چند فیلد از یک رکورد استفاده می‌شود.
User::find(1)->update([
"username" => "John Smith"
]);

این کد نام کاربری با id برابر با ۱ را به 'John Smith' تغییر می‌دهد.

متد create:
متد create برای ایجاد یک رکورد جدید در پایگاه داده استفاده می‌شود. این متد به یک آرایه از داده‌ها نیاز دارد که باید با ویژگی‌های $fillable مدل تطابق داشته باشند.
$user = User::create([
'name' => 'Alice Doe',
'email' => 'alice@example.com',
'password' => bcrypt('password123')
]);

این کد یک رکورد جدید با موارد داده شده ایجاد می کند.

در قسمت های بعدی با سایر متد ها آشنا می شویم.

#laravel #لاراول #فصل_۴
@AmirhDeveloper
.
6👍1🔥1
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت دوم (متدهای ایجاد، ذخیره)


1- متد create
برای ایجاد و ذخیره یک مدل جدید در دیتابیس استفاده می‌شود. این متد یک آرایه از ویژگی‌ها را می‌گیرد و یک رکورد جدید را در دیتابیس ایجاد و ذخیره می‌کند.
$user = User::create([
'name' => 'John',
]);


2- متد firstOrNew
سعی می‌کند یک رکورد مطابق با شرایط مشخص شده را در دیتابیس پیدا کند. اگر پیدا شود، همان مدل را برمی‌گرداند؛ در غیر این صورت، یک مدل جدید ایجاد می‌کند ولی آن را ذخیره نمی‌کند.
$user = User::firstOrNew(['email' => 'example@gmail.com']);
$user->name = 'John';
$user->save();

اگر چنین کاربری وجود داشته باشد، آن را برمی‌گرداند. اگر نه، یک نمونه‌ی جدید ایجاد می‌کند و شما می‌توانید قبل از ذخیره، اطلاعات بیشتری را به آن اضافه کنید.

3- متد firstOrCreate
مشابه firstOrNew است، اما به محض اینکه مدل جدید را ایجاد کرد، بلافاصله آن را در دیتابیس ذخیره می‌کند.
$user = User::firstOrCreate(
['email' => 'example@gmail.com'],
['name' => 'John']
);


4- متد updateOrCreate
یک رکورد را بر اساس شرایط مشخص شده به‌روز رسانی می‌کند و اگر وجود نداشت، یک رکورد جدید ایجاد و ذخیره می‌کند.
$user = User::updateOrCreate(
['email' => 'example@gmail.com'],
['name' => 'John']
);


5- متد save
برای ذخیره کردن یک مدل جدید یا به‌روزرسانی یک مدل موجود در دیتابیس استفاده می‌شود.
$user = new User;
$user->name = 'John';
$user->save();

این کد یک نمونه‌ی جدید از مدل User ایجاد می‌کند، سپس مقادیر فیلدهای name را تنظیم می‌کند و در نهایت آن را در دیتابیس ذخیره می‌کند.

6- متد saveMany
برای ذخیره کردن چندین مدل مرتبط در یک زمان استفاده می‌شود.
$post = Post::find(1);
$comments = [
new Comment(['message' => 'First']),
new Comment(['message' => 'Second']),
];
$post->comments()->saveMany($comments);

این مثال برای یک پست چندین کامنت ایجاد و ذخیره می کند (توضیح کامل تر پس از آموزش روابط دیتابیس)

7- متد saveQuietly
مشابه متد save است، با این تفاوت که رویدادهای مدل (events) را تحریک نمی‌کند.

8- متد createMany
برای ایجاد و ذخیره چندین مدل به طور همزمان استفاده می‌شود.
$post = Post::find(1);
$post->comments()->createMany([
['message' => 'First'],
['message' => 'Second']
]);

این مثال برای یک پست چندین کامنت ایجاد می کند (توضیح کامل تر پس از آموزش روابط دیتابیس)

9- متد createManyQuietly
مشابه createMany است، اما رویدادهای مدل (events) را تحریک نمی‌کند.

10- متد createQuietly
مشابه create است، اما رویدادهای مدل را تحریک نمی‌کند.

11- متد insert
برای وارد کردن چندین رکورد به طور همزمان در جدول دیتابیس استفاده می‌شود. این متد یک نمونه از مدل را برنمی‌گرداند.
User::insert([
['name' => 'John'],
['name' => 'Jane']
]);


12- متد insertOrIgnore
مانند insert است، اما اگر رکوردها در زمان درج، خطایی ایجاد کنند (مانند تکراری بودن داده‌ها)، این خطاها را نادیده می‌گیرد.

13- متد insertUsing
به شما اجازه می‌دهد داده‌ها را از یک کوئری دیگر درج کنید.
ArchivedUser::insertUsing(['name', 'email'], function ($query) {
$query->select('name', 'email')->from('users')->where('active', 0);
});

این کد کاربران غیر فعال را از جدول users انتخاب کرده و در جدول archived_users درج می‌کند.(توضیح سایر متد ها در قسمت های بعد).

14- متد insertGetId
یک رکورد جدید درج می‌کند و شناسه (ID) آن رکورد را برمی‌گرداند.
User::insertGetId(
['name' => 'John']
);


15- متد upsert
چندین رکورد را درج یا به‌روزرسانی می‌کند. این متد برای شرایطی مناسب است که شما می‌خواهید رکوردهایی که وجود دارند را به‌روزرسانی کنید و رکوردهایی که وجود ندارند را ایجاد کنید.
User::upsert([
['email' => 'john@gmail.com', 'name' => 'John'],
['email' => 'jane@gmail.com', 'name' => 'Jane']
], ['email'], ['name']);

اگر کاربری با همان ایمیل وجود داشته باشد، فقط نامش به‌روزرسانی می‌شود؛ وگرنه رکورد جدیدی ایجاد می‌شود.

16- متد updateOrInsert
این متد شبیه updateOrCreate است، با این تفاوت که مستقیماً با دیتابیس کار می‌کند و مدل را باز نمی‌گرداند.

17- متد fill
برای پر کردن مدل با داده‌های مشخص استفاده می‌شود. این متد مدل را ذخیره نمی‌کند؛ تنها مقادیر فیلدها را تنظیم می‌کند.
$user = new User;
$user->fill(['name' => 'John']);
$user->save();



#laravel #لاراول #فصل_۴
@AmirhDeveloper
.
72👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت سوم (متدهای ویرایش، حذف)


1- متد update
برای به‌روزرسانی رکوردهای موجود در دیتابیس استفاده می‌شود.
User::where('email', 'example@gmail.com')->update(['name' => 'John']);

این کد فیلد name تمام کاربران با ایمیل مشخص شده را به 'John' تغییر می‌دهد.

2- متد increment
برای افزایش مقدار یک فیلد عددی استفاده می‌شود.
User::where('id', 1)->increment('age', 2);

این کد مقدار فیلد age کاربر با id 1 را به اندازه 2 افزایش می‌دهد.

3- متد decrement
برای کاهش مقدار یک فیلد عددی استفاده می‌شود.
User::where('id', 1)->decrement('age', 2);

این کد مقدار فیلد age کاربر با id 1 را به اندازه 2 کاهش می‌دهد.

4- متد incrementEach
برای افزایش مقدار یک فیلد عددی در چندین رکورد به طور همزمان استفاده می‌شود.
User::whereIn('id', [1, 2, 3])->incrementEach('credits', 5);

این کد مقدار فیلد credits را برای کاربران با شناسه‌های 1، 2 و 3 به اندازه 5 افزایش می‌دهد.

5- متد decrementEach
برای کاهش مقدار یک فیلد عددی در چندین رکورد به طور همزمان استفاده می‌شود.
User::whereIn('id', [1, 2, 3])->decrementEach('credits', 5);

این کد مقدار فیلد credits را برای کاربران با شناسه‌های 1، 2 و 3 به اندازه 5 کاهش می‌دهد.

6- متد delete
برای حذف رکوردهای موجود در دیتابیس استفاده می‌شود.
User::where('id', 1)->delete();

این کد کاربر با id 1 را از دیتابیس حذف می‌کند.

7- متد truncate
برای حذف تمام رکوردها از یک جدول و بازنشانی auto-increment استفاده می‌شود.
User::truncate();

این کد تمام کاربران را از جدول users حذف می‌کند و شناسه خودکار را به مقدار اولیه بازنشانی می‌کند.

8- متد deleteQuietly
مشابه delete است، اما رویدادهای مدل را تحریک نمی‌کند.

9- متد forceDelete
برای حذف دائم رکوردها از دیتابیس استفاده می‌شود، حتی اگر از ویژگی Soft Delete استفاده شود.
User::find(1)->forceDelete();

این کد کاربر با id 1 را به طور دائم از دیتابیس حذف می‌کند.

10- متد forceDeleteQuietly
مشابه forceDelete است، اما رویدادهای مدل را تحریک نمی‌کند.

11- متد destroy
برای حذف یک یا چند رکورد با شناسه‌های مشخص استفاده می‌شود.
User::destroy([1, 2, 3]);

این کد کاربران با شناسه‌های 1، 2 و 3 را از دیتابیس حذف می‌کند.

12- متد forceDestroy
برای حذف دائم یک یا چند رکورد حتی با استفاده از ویژگی Soft Delete استفاده می‌شود.
User::forceDestroy([1, 2, 3]);

این کد کاربران با شناسه‌های 1، 2 و 3 را به طور دائم از دیتابیس حذف می‌کند، حتی اگر در حالت Soft Delete باشند.

13- متد restore
برای بازیابی رکوردهایی که Soft Delete شده‌اند، استفاده می‌شود.
User::where('id', 1)->restore();

این کد کاربر با id 1 را که Soft Delete شده بود، بازیابی می‌کند.

14- متد restoreQuietly
مشابه restore است، اما رویدادهای مدل را تحریک نمی‌کند.

15- متد replicate
برای ایجاد یک کپی از یک مدل موجود استفاده می‌شود.
$user = User::find(1);
$newUser = $user->replicate();
$newUser->save();

این کد یک کپی از کاربر با id 1 ایجاد کرده و آن را به عنوان یک رکورد جدید ذخیره می‌کند.

16- متد withTrashed
به شما اجازه می‌دهد رکوردهایی که Soft Delete شده اند را نیز در نتایج جستجو بازگردانید.
$users = User::withTrashed()->where('name', 'John')->get();

این کد تمام کاربران با نام 'John' را برمی‌گرداند، حتی آنهایی که Soft Delete شده‌اند.

17- متد onlyTrashed
به شما اجازه می‌دهد تنها رکوردهایی که Soft Delete شده اند را در نتایج جستجو بازگردانید.
$users = User::onlyTrashed()->where('name', 'John')->get();

این کد تمام کاربران با نام 'John' که Soft Delete شده‌اند را برمی‌گرداند.

18- متد trashed
بررسی می‌کند که آیا یک رکورد خاص Soft Delete شده است یا خیر.
$user = User::find(1);
if ($user->trashed()) {
//
}

این کد بررسی می‌کند که آیا کاربر با id برابر 1 Soft Delete شده است یا خیر و اگر بله، کدی را اجرا می‌کند.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
53👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت چهارم (متدهای بازیابی)


1- متد get
برای بازیابی مجموعه‌ای از رکوردها از دیتابیس استفاده می‌شود.
$users = User::where('status', 'active')->get();


2- متد first
اولین رکورد مطابق با شرایط مشخص شده را بازیابی می‌کند.
$user = User::where('status', 'active')->first();


3- متد firstOrFail
اولین رکورد مطابق با شرایط را بازیابی می‌کند؛ اگر رکوردی یافت نشود، یک استثنا برگشت داده می‌شود.
$user = User::where('status', 'active')->firstOrFail();


4- متد value
برای بازیابی مقدار یک فیلد خاص از اولین رکورد مطابق با شرایط استفاده می‌شود.
$email = User::where('name', 'John')->value('email');

این کد مقدار فیلد email اولین کاربری که نام آن 'John' باشد را برمی‌گرداند.

5- متد find
برای بازیابی رکوردی با شناسه (ID) مشخص استفاده می‌شود.
$user = User::find(1);


6- متد pluck
برای بازیابی مقادیر یک ستون خاص از تمام رکوردهای مطابق استفاده می‌شود.
$emails = User::where('status', 'active')->pluck('email');

این کد تمامی ایمیل‌های کاربران با وضعیت 'active' را به صورت آرایه‌ای از مقادیر برمی‌گرداند.

7- متد select
برای انتخاب ستون‌های خاص از جدول استفاده می‌شود.
$users = User::select('name', 'email')->get();

این کد فقط نام و ایمیل تمام کاربران را از دیتابیس بازیابی می‌کند.

8- متد distinct
برای انتخاب مقادیر منحصر به فرد (یونیک) از یک ستون خاص استفاده می‌شود.
$names = User::select('name')->distinct()->get();

این کد تمامی نام‌های منحصر به فرد کاربران را از دیتابیس بازیابی می‌کند.

9- متد addSelect
برای اضافه کردن ستون‌های بیشتر به یک کوئری select استفاده می‌شود.
$users = User::select('name')->addSelect('email')->get();

این کد ابتدا ستون name را انتخاب می‌کند و سپس ستون email را به کوئری اضافه می‌کند.

10- متد selectRaw
برای نوشتن کوئری‌های خام SQL استفاده می‌شود.
$users = User::selectRaw('name, COUNT(*) as count')->groupBy('name')->get();

این کد نام کاربران را به همراه تعداد رکوردهای مربوط به هر نام، با استفاده از کوئری خام SQL، بازیابی می‌کند.

11- متد firstWhere
اولین رکورد مطابق با شرایط مشخص شده را بازیابی می‌کند.
$user = User::firstWhere('name', 'John');

این کد اولین کاربری که نام آن 'John' باشد را بازیابی می‌کند.

12- متد findOr
رکوردی با شناسه مشخص را بازیابی می‌کند یا یک عمل جایگزین را اجرا می‌کند اگر یافت نشد.
$user = User::findOr(1, function () {
return new User(['name' => 'Default User']);
});

این کد کاربری با شناسه 1 را پیدا می‌کند. اگر وجود نداشته باشد، یک کاربر جدید با نام 'Default User' ایجاد می‌کند.

13- متد firstOr
اولین رکورد مطابق با شرایط را بازیابی می‌کند یا یک عمل جایگزین را اجرا می‌کند اگر رکورد یافت نشد.
$user = User::where('name', 'John')->firstOr(function () {
return new User(['name' => 'Default User']);
});

این کد اولین کاربری که نام آن 'John' باشد را بازیابی می‌کند. اگر وجود نداشته باشد، یک کاربر جدید با نام 'Default User' ایجاد می‌کند.

14- متد findOrFail
رکوردی با شناسه مشخص را بازیابی می‌کند. اگر وجود نداشته باشد، یک استثنا برگشت داده می‌شود.
$user = User::findOrFail(1);

این کد کاربری با شناسه 1 را بازیابی می‌کند. اگر وجود نداشته باشد، یک استثنا برگشت داده می‌شود.

15- متد findOrNew
رکوردی با شناسه مشخص را بازیابی می‌کند یا یک مدل جدید ایجاد می‌کند اگر رکورد یافت نشد.
$user = User::findOrNew(1);

این کد کاربری با شناسه 1 را بازیابی می‌کند. اگر کاربری با این شناسه وجود نداشته باشد، یک نمونه جدید از مدل User ایجاد می‌کند.

16- متد firstOrCreate
تلاش می‌کند اولین رکورد مطابق با شرایط را پیدا کند؛ اگر یافت نشد، یک رکورد جدید ایجاد و در دیتابیس ذخیره می‌کند.
$user = User::firstOrCreate(
['email' => 'test@gmail.com'],
['name' => 'John']
);

این کد تلاش می‌کند تا اولین کاربر با ایمیل 'test@gmail.com' را پیدا کند. اگر وجود نداشت، یک کاربر جدید با ادغام دو ورودی ایجاد می‌کند.

▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
53👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت پنجم (متدهای شرطی - 1)


1- متد where
رای اعمال یک شرط بر روی کوئری استفاده می‌شود.
$users = User::where('status', 'active')->where('age',  '>', '18')->get();

این کد تمام کاربران با وضعیت 'active' و سن بزرگتر از 18 را بازیابی می‌کند.

2- متد orWhere
برای اعمال یک شرط OR بر روی کوئری استفاده می‌شود.
$users = User::where('status', 'active')->orWhere('age', '>', 18)->get();

این کد تمام کاربران با وضعیت 'active' یا کاربرانی که سن آن‌ها بیشتر از ۱۸ است را بازیابی می‌کند.

3- متد whereNot
برای اعمال شرطی که مخالف یک شرط مشخص است، استفاده می‌شود.
$users = User::whereNot('status', 'inactive')->get();

ین کد تمام کاربرانی که وضعیت آن‌ها 'inactive' نیست را بازیابی می‌کند.

4- متد orWhereNot
برای اعمال یک شرط OR که مخالف یک شرط مشخص است، استفاده می‌شود.
$users = User::where('age', '<', 30)->orWhereNot('status', 'inactive')->get();

این کد تمام کاربرانی که سن آن‌ها کمتر از ۳۰ است یا وضعیت آن‌ها 'inactive' نیست را بازیابی می‌کند.

5- متد whereRaw
به شما اجازه می‌دهد که یک شرط خام SQL را به کوئری اضافه کنید.
$users = User::whereRaw('age > ? AND status = ?', [18, 'active'])->get();

این کد تمام کاربران با سن بیشتر از ۱۸ و وضعیت 'active' را بازیابی می‌کند.

6- متد orWhereRaw
برای افزودن شرط OR به یک کوئری با استفاده از SQL خام استفاده می‌شود.
$users = User::where('status', 'active')->orWhereRaw('age > ?', [18])->get();

این کد تمام کاربران با وضعیت 'active' یا سن بیشتر از ۱۸ را بازیابی می‌کند.

7- متد whereColumn
برای اعمال شرطی که دو ستون را با یکدیگر مقایسه می‌کند، استفاده می‌شود.
$users = User::whereColumn('created_at', '>', 'updated_at')->get();

این کد تمام کاربرانی را که تاریخ ایجاد آن‌ها جدیدتر از تاریخ به‌روزرسانی‌شان است، بازیابی می‌کند.

8- متد whereNull
برای جستجوی رکوردهایی که مقدار مشخصی در آن‌ها NULL است، استفاده می‌شود.
$users = User::whereNull('deleted_at')->get();

این کد تمام کاربرانی که فیلد deleted_at آن‌ها مقدار NULL دارد (حذف نشده‌اند)، بازیابی می‌کند.

9- متد whereNotNull
رای جستجوی رکوردهایی که مقدار مشخصی در آن‌ها NULL نیست، استفاده می‌شود.
$users = User::whereNotNull('email')->get();

این کد تمام کاربرانی که فیلد email آن‌ها مقدار NULL ندارد را بازیابی می‌کند.

10- متد whereDate
برای فیلتر کردن رکوردها بر اساس تاریخ استفاده می‌شود.
$users = User::whereDate('created_at', '2024-09-12')->get();


11- متد whereMonth
برای فیلتر کردن رکوردها بر اساس ماه استفاده می‌شود.
$users = User::whereMonth('created_at', '09')->get();


12- متد whereDay
برای فیلتر کردن رکوردها بر اساس روز استفاده می‌شود.
$users = User::whereDay('created_at', '12')->get();


13- متد whereYear
برای فیلتر کردن رکوردها بر اساس سال استفاده می‌شود.
$users = User::whereYear('created_at', '2024')->get();


14- متد whereTime
برای فیلتر کردن رکوردها بر اساس زمان استفاده می‌شود.
$users = User::whereTime('created_at', '14:30:00')->get();


15- متد whereAny
برای فیلتر کردن رکوردها با هر یک از شرایط مشخص استفاده می‌شود.
$users = User::whereAny([
['status', 'active'],
['age', '>', 18]
])->get();

این کد تمام کاربرانی را که وضعیت آن‌ها 'active' است یا سن آن‌ها بیشتر از ۱۸ است، بازیابی می‌کند.

16- متد whereAll
برای فیلتر کردن رکوردها با تمام شرایط مشخص استفاده می‌شود.
$users = User::whereAll([
['status', 'active'],
['age', '>', 18]
])->get();

این کد تمام کاربرانی را که وضعیت آن‌ها 'active' و سن آن‌ها بیشتر از ۱۸ است، بازیابی می‌کند.

17- متد whereNone
برای فیلتر کردن رکوردهایی که هیچ‌کدام از شرایط مشخص را ندارند، استفاده می‌شود.
$users = User::whereNone([
['status', 'inactive'],
['age', '<', 18]
])->get();

این کد تمام کاربرانی را که وضعیت آن‌ها 'inactive' نیست و سن آن‌ها کمتر از ۱۸ نیست، بازیابی می‌کند.

▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
62👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت پنجم (متدهای شرطی - 2)


1- متد whereBetween
برای فیلتر کردن رکوردهایی که مقدار یک ستون بین دو مقدار مشخص است، استفاده می‌شود.
$users = User::whereBetween('age', [18, 30])->get();

این کد تمام کاربرانی را که سن آن‌ها بین ۱۸ تا ۳۰ است، بازیابی می‌کند.

2- متد whereNotBetween
برای فیلتر کردن رکوردهایی که مقدار یک ستون خارج از محدوده دو مقدار مشخص است، استفاده می‌شود.
$users = User::whereNotBetween('age', [18, 30])->get();


3- متد whereBetweenColumns
برای فیلتر کردن رکوردهایی که مقدار یک ستون بین مقادیر دو ستون دیگر است، استفاده می‌شود.
$users = User::whereBetweenColumns('salary', ['min_salary', 'max_salary'])->get();

این کد تمام کاربرانی را که مقدار ستون salary آن‌ها بین مقادیر ستون‌های min_salary و max_salary است، بازیابی می‌کند.

4- متد whereNotBetweenColumns
برای فیلتر کردن رکوردهایی که مقدار یک ستون خارج از مقادیر دو ستون دیگر است، استفاده می‌شود.
$users = User::whereNotBetweenColumns('salary', ['min_salary', 'max_salary'])->get();


5- متد whereIn
برای فیلتر کردن رکوردهایی که مقدار ستون مشخص شده در یک لیست از مقادیر است، استفاده می‌شود.
$users = User::whereIn('id', [1, 2, 3])->get();

این کد تمام کاربرانی که شناسه آن‌ها یکی از ۱، ۲ یا ۳ است، بازیابی می‌کند.

6- متد whereNotIn
برای فیلتر کردن رکوردهایی که مقدار ستون مشخص شده در لیست مقادیر معین نیست، استفاده می‌شود.
$users = User::whereNotIn('id', [1, 2, 3])->get();


7- متد whereIntegerInRaw
مشابه whereIn است، اما از کوئری خام SQL برای مقایسه استفاده می‌کند و به طور خاص برای لیست های بزرگ اعداد مناسب است.
$users = User::whereIntegerInRaw('id', [1, 2, 3])->get();

این کد از SQL خام برای بازیابی تمام کاربرانی که شناسه آن‌ها ۱، ۲ یا ۳ است استفاده می‌کند.

8- متد whereIntegerNotInRaw
مشابه whereNotIn است، اما از کوئری خام SQL برای مقایسه استفاده می‌کند و به طور خاص برای لیست های بزرگ اعداد مناسب است.
$users = User::whereIntegerNotInRaw('id', [1, 2, 3])->get();


9- متد whereFullText
برای جستجوی تمام متن (full-text search) در ستون‌های خاص استفاده می‌شود. این متد در جداولی که از فیلدهای full-text پشتیبانی می‌کنند، کاربرد دارد.
$posts = Post::whereFullText('content', 'Laravel')->get();

این کد تمام پست‌هایی را که محتوای آن‌ها شامل کلمه 'Laravel' است، بازیابی می‌کند.

10- متد orWhereFullText
مشابه whereFullText است، اما برای افزودن شرط OR در جستجوی تمام متن استفاده می‌شود.
$posts = Post::where('status', 'published')->orWhereFullText('content', 'Laravel')->get();


11- متد whereJsonContains
برای جستجو در فیلدهای JSON استفاده می‌شود و رکوردهایی را که شامل مقدار مشخصی در فیلد JSON هستند، بازیابی می‌کند.
$users = User::whereJsonContains('options->languages', 'en')->get();

این کد تمام کاربرانی را که فیلد options->languages آن‌ها شامل مقدار 'en' است، بازیابی می‌کند.

12- متد whereJsonLength
برای بررسی طول یک فیلد JSON استفاده می‌شود.
$users = User::whereJsonLength('options->languages', 2)->get();

این کد تمام کاربرانی را که تعداد مقادیر موجود در فیلد options->languages آن‌ها برابر با ۲ است، بازیابی می‌کند.

13- متد whereLike
برای جستجوی رشته‌ای با استفاده از الگوی LIKE استفاده می‌شود.
$users = User::whereLike('name', 'John%')->get();

این کد تمام کاربرانی که نام آن‌ها با 'John' شروع می‌شود را بازیابی می‌کند.

14- متد orWhereLike
مشابه whereLike است، اما برای افزودن شرط OR در جستجوی رشته‌ای استفاده می‌شود.
$users = User::where('status', 'active')->orWhereLike('name', 'John%')->get();


15- متد whereNotLike
برای جستجوی رشته‌ای که با یک الگوی LIKE خاص تطابق نداشته باشد، استفاده می‌شود.
$users = User::whereNotLike('name', 'John%')->get();


16- متد orWhereNotLike
مشابه whereNotLike است، اما برای افزودن شرط OR در جستجوی رشته‌ای که با الگوی LIKE خاص تطابق ندارد، استفاده می‌شود.
$users = User::where('status', 'inactive')->orWhereNotLike('name', 'John%')->get();


▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍1🔥1