نسخه:

ORM الکوئنت

معرفی

ORM Eloquent همراه با لاراول یک پیاده سازی ActiveRecord زیبا و ساده برای کار با پایگاه داده شما ارائه می دهد. هر جدول پایگاه داده یک "مدل" مربوطه دارد که برای تعامل با آن جدول استفاده می شود.

قبل از شروع، حتماً اتصال پایگاه داده را در پیکربندی کنید config/database.php .

استفاده پایه

برای شروع، یک مدل Eloquent ایجاد کنید. مدل‌ها معمولاً در app دایرکتوری زندگی می‌کنند، اما شما می‌توانید آن‌ها را در هر جایی که می‌تواند به‌طور خودکار مطابق با composer.json فایل شما بارگذاری شود، قرار دهید. همه مدل های Eloquent گسترش می یابند Illuminate\Database\Eloquent\Model .

تعریف یک مدل الکوئنت

class User extends Model {}

همچنین می توانید مدل های Eloquent را با استفاده از make:model دستور زیر تولید کنید:

php artisan make:model User

توجه داشته باشید که ما به Eloquent نگفتیم که از کدام جدول برای User مدل خود استفاده کنیم. نام جمع "snake case" به عنوان نام جدول استفاده می شود مگر اینکه نام دیگری به صراحت مشخص شده باشد. بنابراین، در این مورد، Eloquent فرض می کند که User مدل رکوردها را در users جدول ذخیره می کند. table شما می توانید با تعریف یک ویژگی در مدل خود یک جدول سفارشی را مشخص کنید :

class User extends Model {
 
protected $table = 'my_users';
 
}

نکته: Eloquent همچنین فرض می‌کند که هر جدول دارای یک ستون کلید اصلی به نام id . شما ممکن است یک primaryKey ویژگی برای لغو این قرارداد تعریف کنید. به همین ترتیب، ممکن است یک connection ویژگی برای لغو نام اتصال پایگاه داده تعریف کنید که باید هنگام استفاده از مدل استفاده شود.

هنگامی که یک مدل تعریف شد، آماده شروع بازیابی و ایجاد رکوردها در جدول خود هستید. توجه داشته باشید که به طور پیش فرض باید ستون ها updated_at و created_at ستون ها را روی جدول خود قرار دهید. اگر نمی‌خواهید این ستون‌ها به صورت خودکار نگهداری شوند، ویژگی $timestamps مدل خود را روی false .

بازیابی همه سوابق

$users = User::all();

بازیابی یک رکورد با کلید اصلی

$user = User::find(1);
 
var_dump($user->name);

توجه: تمام روش‌های موجود در Query Builder هنگام جستجوی مدل‌های Eloquent نیز در دسترس هستند.

بازیابی یک مدل با کلید اصلی یا پرتاب یک استثنا

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

$model = User::findOrFail(1);
 
$model = User::where('votes', '>', 100)->firstOrFail();

انجام این کار به شما امکان می دهد استثنا را پیدا کنید تا بتوانید در صورت لزوم وارد شوید و صفحه خطا را نمایش دهید. برای دریافت ModelNotFoundException ، مقداری منطق به app/Exceptions/Handler.php فایل خود اضافه کنید.

use Illuminate\Database\Eloquent\ModelNotFoundException;
 
class Handler extends ExceptionHandler {
 
public function render($request, Exception $e)
{
if ($e instanceof ModelNotFoundException)
{
// Custom logic for model not found...
}
 
return parent::render($request, $e);
}
 
}

پرس و جو با استفاده از مدل های الکوئنت

$users = User::where('votes', '>', 100)->take(10)->get();
 
foreach ($users as $user)
{
var_dump($user->name);
}

مصالح الکوئنت

البته، می‌توانید از توابع جمع‌آوری ساز کوئری نیز استفاده کنید.

$count = User::where('votes', '>', 100)->count();

اگر قادر به ایجاد پرس و جوی مورد نیاز خود از طریق رابط روان نیستید، به راحتی استفاده کنید whereRaw :

$users = User::whereRaw('age > ? and votes = 100', [25])->get();

نتایج تکه تکه شدن

اگر نیاز به پردازش تعداد زیادی (هزاران) رکورد Eloquent دارید، با استفاده از chunk دستور به شما این امکان را می دهد که بدون خوردن تمام رم خود این کار را انجام دهید:

User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});

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

تعیین اتصال پرس و جو

همچنین می‌توانید مشخص کنید که از کدام اتصال پایگاه داده هنگام اجرای یک پرسش Eloquent استفاده شود. به سادگی از on روش استفاده کنید:

$user = User::on('connection-name')->find(1);

اگر از اتصالات خواندن/نوشتن استفاده می‌کنید ، می‌توانید پرس و جو را مجبور به استفاده از اتصال «نوشتن» با روش زیر کنید:

$user = User::onWriteConnection()->find(1);

تکلیف انبوه

هنگام ایجاد یک مدل جدید، آرایه ای از ویژگی ها را به سازنده مدل منتقل می کنید. سپس این ویژگی ها از طریق انبوه به مدل اختصاص داده می شوند. این راحت است. با این حال، می تواند یک نگرانی امنیتی جدی در هنگام ارسال کورکورانه ورودی کاربر به یک مدل باشد. اگر ورودی کاربر کورکورانه به یک مدل داده شود، کاربر آزاد است که هر یک و همه ویژگی های مدل را تغییر دهد. به همین دلیل، تمام مدل های Eloquent به طور پیش فرض در برابر انبوه انتساب محافظت می کنند.

برای شروع، fillable یا guarded ویژگی ها را در مدل خود تنظیم کنید.

تعریف ویژگی های قابل پر کردن در یک مدل

ویژگی fillable مشخص می کند که کدام ویژگی ها باید قابل انتساب باشند. این را می توان در سطح کلاس یا نمونه تنظیم کرد.

class User extends Model {
 
protected $fillable = ['first_name', 'last_name', 'email'];
 
}

در این مثال، تنها سه ویژگی فهرست شده قابل تخصیص انبوه خواهند بود.

تعریف ویژگی های محافظت شده در یک مدل

معکوس آن fillable است guarded و به‌عنوان «لیست سیاه» به جای «لیست سفید» عمل می‌کند:

class User extends Model {
 
protected $guarded = ['id', 'password'];
 
}

توجه: هنگام استفاده از guarded , هرگز نباید Input::get() هیچ آرایه خام ورودی کنترل شده توسط کاربر را به یک save یا update متد ارسال کنید، زیرا هر ستونی که محافظت نشده است ممکن است به روز شود.

مسدود کردن همه ویژگی ها از تخصیص انبوه

در مثال بالا، ممکن است ویژگی‌های id and به انبوه اختصاص داده نشوند . همه صفات دیگر قابل تخصیص انبوه خواهند بود. همچنین می‌توانید با استفاده از ویژگی guard تمام ویژگی‌ها را از تخصیص انبوه مسدود کنید: password

protected $guarded = ['*'];

درج، به روز رسانی، حذف

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

ذخیره یک مدل جدید

$user = new User;
 
$user->name = 'John';
 
$user->save();

توجه: به طور معمول، مدل های Eloquent شما دارای کلیدهای افزایش خودکار هستند. با این حال، اگر می‌خواهید کلیدهای خود را مشخص کنید، ویژگی incrementing مدل خود را روی false .

همچنین می توانید از این create روش برای ذخیره یک مدل جدید در یک خط استفاده کنید. نمونه مدل درج شده از متد به شما بازگردانده می شود. با این حال، قبل از انجام این کار، باید یک fillable یا guarded ویژگی را در مدل مشخص کنید، زیرا همه مدل‌های Eloquent در برابر تخصیص انبوه محافظت می‌کنند.

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

$insertedId = $user->id;

تنظیم ویژگی های محافظت شده در مدل

class User extends Model {
 
protected $guarded = ['id', 'account_id'];
 
}

با استفاده از روش ایجاد مدل

// Create a new user in the database...
$user = User::create(['name' => 'John']);
 
// Retrieve the user by the attributes, or create it if it doesn't exist...
$user = User::firstOrCreate(['name' => 'John']);
 
// Retrieve the user by the attributes, or instantiate a new instance...
$user = User::firstOrNew(['name' => 'John']);

به روز رسانی یک مدل بازیابی شده

برای به روز رسانی یک مدل، می توانید آن را بازیابی کنید، یک ویژگی را تغییر دهید و از save روش زیر استفاده کنید:

$user = User::find(1);
 
$user->email = 'john@foo.com';
 
$user->save();

ذخیره یک مدل و روابط

گاهی اوقات ممکن است بخواهید نه تنها یک مدل، بلکه همه روابط آن را نیز ذخیره کنید. برای انجام این کار، می توانید از push روش زیر استفاده کنید:

$user->push();

همچنین می‌توانید به‌روزرسانی‌ها را به‌عنوان پرس و جو در برابر مجموعه‌ای از مدل‌ها اجرا کنید:

$affectedRows = User::where('votes', '>', 100)->update(['status' => 2]);

توجه: هنگام به‌روزرسانی مجموعه‌ای از مدل‌ها از طریق سازنده پرس و جو Eloquent، هیچ رویداد مدلی فعال نمی‌شود.

حذف یک مدل موجود

برای حذف یک مدل، به سادگی delete متد موجود در نمونه را فراخوانی کنید:

$user = User::find(1);
 
$user->delete();

حذف یک مدل موجود توسط کلید

User::destroy(1);
 
User::destroy([1, 2, 3]);
 
User::destroy(1, 2, 3);

البته، می‌توانید پرس و جوی حذف را روی مجموعه‌ای از مدل‌ها نیز اجرا کنید:

$affectedRows = User::where('votes', '>', 100)->delete();

فقط مُهرهای زمانی مدل به‌روزرسانی می‌شود

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

$user->touch();

حذف نرم

هنگام حذف نرم یک مدل، در واقع از پایگاه داده شما حذف نمی شود. در عوض، یک deleted_at مهر زمانی روی رکورد تنظیم می شود. برای فعال کردن حذف های نرم برای یک مدل، عبارت را SoftDeletes در مدل اعمال کنید:

use Illuminate\Database\Eloquent\SoftDeletes;
 
class User extends Model {
 
use SoftDeletes;
 
protected $dates = ['deleted_at'];
 
}

برای اضافه کردن یک deleted_at ستون به جدول خود، می توانید softDeletes از روش مهاجرت استفاده کنید:

$table->softDeletes();

delete اکنون، هنگامی که متد را در مدل فراخوانی می‌کنید ، deleted_at ستون روی زمان فعلی تنظیم می‌شود. هنگام جستجوی مدلی که از حذف های نرم استفاده می کند، مدل های "حذف شده" در نتایج پرس و جو گنجانده نمی شوند.

اجبار مدل های حذف شده نرم به نتایج

برای اینکه مدل‌های حذف شده نرم را مجبور کنید در یک مجموعه نتایج ظاهر شوند، از withTrashed روش موجود در پرس و جو استفاده کنید:

$users = User::withTrashed()->where('account_id', 1)->get();

این withTrashed روش ممکن است بر روی یک رابطه تعریف شده استفاده شود:

$user->posts()->withTrashed()->get();

اگر می‌خواهید در نتایج خود فقط مدل‌های حذف شده را دریافت کنید، می‌توانید از onlyTrashed روش زیر استفاده کنید:

$users = User::onlyTrashed()->where('account_id', 1)->get();

برای بازگرداندن یک مدل نرم افزاری حذف شده به حالت فعال، از restore روش زیر استفاده کنید:

$user->restore();

همچنین می توانید از restore روش در یک پرس و جو استفاده کنید:

User::withTrashed()->where('account_id', 1)->restore();

مانند با withTrashed ، این restore روش ممکن است در روابط نیز استفاده شود:

$user->posts()->restore();

اگر می خواهید واقعاً یک مدل را از پایگاه داده حذف کنید، می توانید از forceDelete روش زیر استفاده کنید:

$user->forceDelete();

این forceDelete روش همچنین روی روابط کار می کند:

$user->posts()->forceDelete();

برای تعیین اینکه آیا یک نمونه مدل معین به نرمی حذف شده است، می توانید از trashed روش زیر استفاده کنید:

if ($user->trashed())
{
//
}

مهر زمانی

created_at به‌طور پیش‌فرض، Eloquent ستون‌های و updated_at را در جدول پایگاه داده شما به‌طور خودکار حفظ می‌کند . به سادگی این timestamp ستون ها را به جدول خود اضافه کنید و Eloquent بقیه موارد را انجام خواهد داد. اگر نمی‌خواهید Eloquent این ستون‌ها را حفظ کند، ویژگی زیر را به مدل خود اضافه کنید:

غیرفعال کردن مهر زمانی خودکار

class User extends Model {
 
protected $table = 'users';
 
public $timestamps = false;
 
}

ارائه یک قالب زمان سفارشی

اگر می‌خواهید قالب مُهرهای زمانی خود را سفارشی کنید، می‌توانید getDateFormat روش را در مدل خود لغو کنید:

class User extends Model {
 
protected function getDateFormat()
{
return 'U';
}
 
}

محدوده های پرس و جو

تعریف محدوده پرس و جو

Scopes به شما این امکان را می دهد که به راحتی از منطق پرس و جو در مدل های خود استفاده کنید. برای تعریف یک محدوده، به سادگی یک متد مدل را با پیشوند زیر وارد کنید scope :

class User extends Model {
 
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
 
public function scopeWomen($query)
{
return $query->whereGender('W');
}
 
}

استفاده از یک محدوده پرس و جو

$users = User::popular()->women()->orderBy('created_at')->get();

دامنه های دینامیک

گاهی اوقات ممکن است بخواهید محدوده ای را تعریف کنید که پارامترها را بپذیرد. فقط پارامترهای خود را به تابع محدوده خود اضافه کنید:

class User extends Model {
 
public function scopeOfType($query, $type)
{
return $query->whereType($type);
}
 
}

سپس پارامتر را به فراخوانی scope ارسال کنید:

$users = User::ofType('member')->get();

دامنه های جهانی

گاهی اوقات ممکن است بخواهید محدوده ای را تعریف کنید که برای همه پرس و جوهای انجام شده روی یک مدل اعمال می شود. در اصل، ویژگی "حذف نرم" خود Eloquent اینگونه عمل می کند. دامنه های جهانی با استفاده از ترکیبی از ویژگی های PHP و پیاده سازی تعریف می شوند Illuminate\Database\Eloquent\ScopeInterface .

ابتدا بیایید یک ویژگی را تعریف کنیم. SoftDeletes برای این مثال، از چیزی که با لاراول ارسال می شود استفاده می کنیم :

trait SoftDeletes {
 
/**
* Boot the soft deleting trait for a model.
*
* @return void
*/
public static function bootSoftDeletes()
{
static::addGlobalScope(new SoftDeletingScope);
}
 
}

اگر یک مدل Eloquent از یک ویژگی استفاده کند که دارای روشی منطبق با bootNameOfTrait نامگذاری باشد، زمانی که مدل Eloquent راه‌اندازی می‌شود، این روش فراخوانی می‌شود و به شما فرصتی می‌دهد تا یک دامنه جهانی ثبت کنید یا هر کار دیگری را که می‌خواهید انجام دهید. یک محدوده باید پیاده سازی شود ScopeInterface که دو روش را مشخص می کند: apply و remove .

متد apply یک Illuminate\Database\Eloquent\Builder شی سازنده پرس و جو را دریافت می کند و Model روی آن اعمال می شود و مسئول افزودن هر where عبارت اضافی است که scope می خواهد اضافه کند. متد remove همچنین یک Builder شی را دریافت می کند Model و مسئول معکوس کردن عمل انجام شده توسط است apply . به عبارت دیگر، remove باید where بند (یا هر بند دیگری) که اضافه شده حذف شود. بنابراین، برای ما SoftDeletingScope ، روش ها چیزی شبیه به این هستند:

/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
$builder->whereNull($model->getQualifiedDeletedAtColumn());
 
$this->extend($builder);
}
 
/**
* Remove the scope from the given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function remove(Builder $builder, Model $model)
{
$column = $model->getQualifiedDeletedAtColumn();
 
$query = $builder->getQuery();
 
foreach ((array) $query->wheres as $key => $where)
{
// If the where clause is a soft delete date constraint, we will remove it from
// the query and reset the keys on the wheres. This allows this developer to
// include deleted model in a relationship result set that is lazy loaded.
if ($this->isSoftDeleteConstraint($where, $column))
{
unset($query->wheres[$key]);
 
$query->wheres = array_values($query->wheres);
}
}
}

روابط

البته، جداول پایگاه داده شما احتمالاً به یکدیگر مرتبط هستند. به عنوان مثال، یک پست وبلاگ ممکن است نظرات زیادی داشته باشد، یا یک سفارش می تواند مربوط به کاربری باشد که آن را ارسال کرده است. Eloquent مدیریت و کار با این روابط را آسان می کند. لاراول انواع مختلفی از روابط را پشتیبانی می کند:

یک به یک

تعریف رابطه یک به یک

رابطه یک به یک یک رابطه بسیار اساسی است. برای مثال، یک User مدل ممکن است یکی داشته باشد Phone . می توانیم این رابطه را در Eloquent تعریف کنیم:

class User extends Model {
 
public function phone()
{
return $this->hasOne('App\Phone');
}
 
}

اولین آرگومان ارسال شده به hasOne متد، نام مدل مرتبط است. هنگامی که رابطه تعریف شد، می‌توانیم آن را با استفاده از ویژگی‌های دینامیک Eloquent بازیابی کنیم :

$phone = User::find(1)->phone;

SQL انجام شده توسط این عبارت به صورت زیر خواهد بود:

select * from users where id = 1
 
select * from phones where user_id = 1

توجه داشته باشید که Eloquent کلید خارجی رابطه را بر اساس نام مدل فرض می کند. در این حالت Phone فرض می شود که مدل از یک user_id کلید خارجی استفاده می کند. اگر می خواهید این قرارداد را لغو کنید، می توانید یک آرگومان دوم را به hasOne متد ارسال کنید. علاوه بر این، می‌توانید آرگومان سومی را به متد ارسال کنید تا مشخص کنید کدام ستون محلی باید برای ارتباط استفاده شود:

return $this->hasOne('App\Phone', 'foreign_key');
 
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

تعریف معکوس یک رابطه

برای تعریف معکوس رابطه در Phone مدل، از روش زیر استفاده می کنیم belongsTo :

class Phone extends Model {
 
public function user()
{
return $this->belongsTo('App\User');
}
 
}

در مثال بالا، Eloquent به دنبال user_id ستونی در phones جدول خواهد بود. اگر می خواهید ستون کلید خارجی دیگری تعریف کنید، می توانید آن را به عنوان آرگومان دوم به belongsTo متد ارسال کنید:

class Phone extends Model {
 
public function user()
{
return $this->belongsTo('App\User', 'local_key');
}
 
}

علاوه بر این، پارامتر سومی را ارسال می کنید که نام ستون مرتبط را در جدول والد مشخص می کند:

class Phone extends Model {
 
public function user()
{
return $this->belongsTo('App\User', 'local_key', 'parent_key');
}
 
}

یک به بسیاری

نمونه ای از رابطه یک به چند، یک پست وبلاگی است که نظرات "بسیاری" دارد. ما می توانیم این رابطه را به این صورت مدل کنیم:

class Post extends Model {
 
public function comments()
{
return $this->hasMany('App\Comment');
}
 
}

اکنون می توانیم از طریق ویژگی پویا به نظرات پست دسترسی پیدا کنیم :

$comments = Post::find(1)->comments;

اگر نیاز به اضافه کردن محدودیت‌های بیشتری برای بازیابی نظرات دارید، می‌توانید comments روش را فراخوانی کنید و شرایط زنجیره‌ای را ادامه دهید:

$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();

مجدداً، ممکن است با ارسال آرگومان دوم به hasMany متد، کلید خارجی معمولی را لغو کنید. و مانند hasOne رابطه، ستون محلی نیز ممکن است مشخص شود:

return $this->hasMany('App\Comment', 'foreign_key');
 
return $this->hasMany('App\Comment', 'foreign_key', 'local_key');

تعریف معکوس یک رابطه

برای تعریف معکوس رابطه در Comment مدل، از روش زیر استفاده می کنیم belongsTo :

class Comment extends Model {
 
public function post()
{
return $this->belongsTo('App\Post');
}
 
}

بسیاری به بسیاری

روابط چند به چند نوع رابطه پیچیده تری هستند. نمونه ای از چنین رابطه ای کاربری با نقش های زیاد است که در آن نقش ها توسط سایر کاربران نیز به اشتراک گذاشته می شود. به عنوان مثال، بسیاری از کاربران ممکن است نقش "Admin" را داشته باشند. سه جدول پایگاه داده برای این رابطه مورد نیاز است: users , roles و role_user . جدول role_user از ترتیب حروف الفبای نام مدل های مرتبط مشتق شده است و باید دارای user_id و role_id ستون باشد.

ما می توانیم با استفاده از روش زیر یک رابطه چند به چند تعریف کنیم belongsToMany :

class User extends Model {
 
public function roles()
{
return $this->belongsToMany('App\Role');
}
 
}

اکنون می‌توانیم نقش‌ها را از طریق User مدل بازیابی کنیم:

$roles = User::find(1)->roles;

اگر می خواهید از یک نام جدول غیر متعارف برای جدول محوری خود استفاده کنید، می توانید آن را به عنوان آرگومان دوم به متد ارسال کنید belongsToMany :

return $this->belongsToMany('App\Role', 'user_roles');

همچنین می توانید کلیدهای مرسوم مرتبط را لغو کنید:

return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'foo_id');

البته، می توانید معکوس رابطه را نیز در Role مدل تعریف کنید:

class Role extends Model {
 
public function users()
{
return $this->belongsToMany('App\User');
}
 
}

دارای بسیاری از طریق

رابطه "از طریق بسیاری دارد" یک میانبر راحت برای دسترسی به روابط دور از طریق یک رابطه میانی فراهم می کند. به عنوان مثال، یک Country مدل ممکن است Post از طریق یک User مدل تعداد زیادی داشته باشد. جداول این رابطه به شکل زیر است:

countries
id - integer
name - string
 
users
id - integer
country_id - integer
name - string
 
posts
id - integer
user_id - integer
title - string

حتی اگر جدول شامل یک ستون posts نیست ، این رابطه به ما امکان می دهد از طریق پست های یک کشور دسترسی داشته باشیم . بیایید رابطه را تعریف کنیم: country_id hasManyThrough $country->posts

class Country extends Model {
 
public function posts()
{
return $this->hasManyThrough('App\Post', 'App\User');
}
 
}

اگر می خواهید کلیدهای رابطه را به صورت دستی مشخص کنید، می توانید آنها را به عنوان آرگومان های سوم و چهارم به متد ارسال کنید:

class Country extends Model {
 
public function posts()
{
return $this->hasManyThrough('App\Post', 'App\User', 'country_id', 'user_id');
}
 
}

روابط چند شکلی

روابط چند شکلی به یک مدل اجازه می دهد که به بیش از یک مدل دیگر، بر روی یک ارتباط واحد تعلق داشته باشد. به عنوان مثال، ممکن است یک مدل عکس داشته باشید که متعلق به یک مدل کارکنان یا یک مدل سفارشی است. ما این رابطه را اینگونه تعریف می کنیم:

class Photo extends Model {
 
public function imageable()
{
return $this->morphTo();
}
 
}
 
class Staff extends Model {
 
public function photos()
{
return $this->morphMany('App\Photo', 'imageable');
}
 
}
 
class Order extends Model {
 
public function photos()
{
return $this->morphMany('App\Photo', 'imageable');
}
 
}

بازیابی یک رابطه چند شکلی

اکنون، می‌توانیم عکس‌ها را برای یکی از کارکنان یا برای سفارش بازیابی کنیم:

$staff = Staff::find(1);
 
foreach ($staff->photos as $photo)
{
//
}

بازیابی مالک یک رابطه چند شکلی

با این حال، جادوی واقعی "چند شکلی" زمانی است که به کارکنان دسترسی دارید یا از Photo مدل سفارش می دهید:

$photo = Photo::find(1);
 
$imageable = $photo->imageable;

بسته به نوع مدلی که عکس را در اختیار دارد، رابطه imageable روی مدل یک یا نمونه Photo برمی‌گرداند . Staff Order

ساختار جدول رابطه چند شکلی

برای کمک به درک این که چگونه این کار می کند، اجازه دهید ساختار پایگاه داده را برای یک رابطه چند شکلی بررسی کنیم:

staff
id - integer
name - string
 
orders
id - integer
price - integer
 
photos
id - integer
path - string
imageable_id - integer
imageable_type - string

فیلدهای کلیدی که در اینجا باید به آنها توجه کرد عبارتند از imageable_id و imageable_type روی photos میز. ID حاوی مقدار شناسه، در این مثال، کارکنان یا سفارشات مالک است، در حالی که نوع شامل نام کلاس مدل مالک است. این چیزی است که به ORM اجازه می دهد تا تعیین کند که چه نوع مدل مالکیتی را هنگام دسترسی به رابطه بازگرداند imageable .

بسیاری از روابط چند شکلی

ساختار جدول روابط چند شکلی

علاوه بر روابط چند شکلی سنتی، ممکن است روابط چند شکلی چند شکلی چند به چند را نیز مشخص کنید. به عنوان مثال، یک وبلاگ Post و Video یک مدل می توانند یک رابطه چند شکلی با یک Tag مدل به اشتراک بگذارند. ابتدا ساختار جدول را بررسی می کنیم:

posts
id - integer
name - string
 
videos
id - integer
name - string
 
tags
id - integer
name - string
 
taggables
tag_id - integer
taggable_id - integer
taggable_type - string

در مرحله بعد، ما آماده هستیم تا روابط را روی مدل تنظیم کنیم. مدل Post و هر دو از طریق یک روش رابطه Video دارند : morphToMany tags

class Post extends Model {
 
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
 
}

مدل Tag ممکن است برای هر یک از روابط خود یک روش تعریف کند:

class Tag extends Model {
 
public function posts()
{
return $this->morphedByMany('App\Post', 'taggable');
}
 
public function videos()
{
return $this->morphedByMany('App\Video', 'taggable');
}
 
}

روابط پرس و جو

پرسش از روابط هنگام انتخاب

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

$posts = Post::has('comments')->get();

همچنین می توانید یک اپراتور و یک تعداد را مشخص کنید:

$posts = Post::has('comments', '>=', 3)->get();

عبارات تودرتو has نیز ممکن است با استفاده از نماد "نقطه" ساخته شوند:

$posts = Post::has('comments.votes')->get();

اگر حتی به قدرت بیشتری نیاز دارید، می توانید از روش whereHas و orWhereHas برای قرار دادن شرایط "where" در has جستارهای خود استفاده کنید:

$posts = Post::whereHas('comments', function($q)
{
$q->where('content', 'like', 'foo%');
 
})->get();

ویژگی های دینامیک

Eloquent به شما امکان می دهد از طریق ویژگی های پویا به روابط خود دسترسی داشته باشید. Eloquent به طور خودکار رابطه را برای شما بارگذاری می کند و حتی به اندازه کافی هوشمند است که بداند روش get (برای روابط یک به چند) یا first (برای روابط یک به یک) را فراخوانی کند. سپس از طریق یک ویژگی پویا با همان نام رابطه قابل دسترسی خواهد بود. برای مثال با مدل زیر $phone :

class Phone extends Model {
 
public function user()
{
return $this->belongsTo('App\User');
}
 
}
 
$phone = Phone::find(1);

به جای تکرار ایمیل کاربر به این صورت:

echo $phone->user()->first()->email;

ممکن است به سادگی کوتاه شود:

echo $phone->user->email;

توجه: روابطی که نتایج زیادی را برمی‌گردانند، نمونه‌ای از کلاس را برمی‌گردانند Illuminate\Database\Eloquent\Collection .

مشتاق بارگیری

بارگیری مشتاق برای کاهش مشکل پرس و جو N + 1 وجود دارد. به عنوان مثال، Book مدلی را در نظر بگیرید که مربوط به Author . رابطه به این صورت تعریف می شود:

class Book extends Model {
 
public function author()
{
return $this->belongsTo('App\Author');
}
 
}

حالا کد زیر را در نظر بگیرید:

foreach (Book::all() as $book)
{
echo $book->author->name;
}

این حلقه 1 پرس و جو را برای بازیابی همه کتاب های روی میز اجرا می کند، سپس یک پرس و جو برای هر کتاب برای بازیابی نویسنده انجام می دهد. بنابراین، اگر 25 کتاب داشته باشیم، این حلقه 26 پرس و جو را اجرا می کند.

خوشبختانه، ما می توانیم از بارگیری مشتاقانه برای کاهش شدید تعداد درخواست ها استفاده کنیم. روابطی که باید مشتاق بارگذاری شوند ممکن است از طریق with روش مشخص شوند:

foreach (Book::with('author')->get() as $book)
{
echo $book->author->name;
}

در حلقه بالا، فقط دو پرس و جو اجرا می شود:

select * from books
 
select * from authors where id in (1, 2, 3, 4, 5, ...)

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

البته، ممکن است مشتاق باشید چندین رابطه را در یک زمان بارگذاری کنید:

$books = Book::with('author', 'publisher')->get();

حتی ممکن است مشتاق باشید روابط تودرتو را بارگیری کنید:

$books = Book::with('author.contacts')->get();

در مثال بالا، author رابطه مشتاق بارگذاری می شود و رابطه نویسنده contacts نیز بارگذاری می شود.

محدودیت های بار مشتاق

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

$users = User::with(['posts' => function($query)
{
$query->where('title', 'like', '%first%');
 
}])->get();

در این مثال، ما مشتاق بارگذاری پست های کاربر هستیم، اما تنها در صورتی که ستون عنوان پست حاوی کلمه "اول" باشد.

البته، بارگذاری مشتاق بسته‌ها به «محدودیت‌ها» محدود نمی‌شوند. همچنین می توانید سفارشات را اعمال کنید:

$users = User::with(['posts' => function($query)
{
$query->orderBy('created_at', 'desc');
 
}])->get();

تنبل مشتاق بارگیری

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

$books = Book::all();
 
$books->load('author', 'publisher');

همچنین می‌توانید برای تعیین محدودیت‌ها در پرس و جو، یک Closure تصویب کنید:

$books->load(['author' => function($query)
{
$query->orderBy('published_date', 'asc');
}]);

پیوست کردن یک مدل مرتبط

شما اغلب نیاز به درج مدل های مرتبط جدید دارید. به عنوان مثال، ممکن است بخواهید یک نظر جدید برای یک پست درج کنید. به جای تنظیم دستی post_id کلید خارجی روی مدل، می‌توانید نظر جدید را Post مستقیماً از مدل اصلی آن وارد کنید:

$comment = new Comment(['message' => 'A new comment.']);
 
$post = Post::find(1);
 
$comment = $post->comments()->save($comment);

در این مثال، post_id فیلد به طور خودکار روی نظر درج شده تنظیم می شود.

اگر نیاز به ذخیره چندین مدل مرتبط دارید:

$comments = [
new Comment(['message' => 'A new comment.']),
new Comment(['message' => 'Another comment.']),
new Comment(['message' => 'The latest comment.'])
];
 
$post = Post::find(1);
 
$post->comments()->saveMany($comments);

مدل‌های مرتبط (متعلق به)

هنگام به روز رسانی یک belongsTo رابطه، می توانید از این associate روش استفاده کنید. این روش کلید خارجی را در مدل فرزند تنظیم می کند:

$account = Account::find(10);
 
$user->account()->associate($account);
 
$user->save();

درج مدل‌های مرتبط (بسیار تا خیلی زیاد)

همچنین می توانید مدل های مرتبط را هنگام کار با روابط چند به چند وارد کنید. بیایید به استفاده از مدل های خود User و Role به عنوان مثال ادامه دهیم. ما به راحتی می توانیم نقش های جدید را با استفاده از روش زیر به کاربر متصل کنیم attach :

چسباندن بسیاری از مدل ها به بسیاری از مدل ها

$user = User::find(1);
 
$user->roles()->attach(1);

همچنین می‌توانید آرایه‌ای از ویژگی‌ها را ارسال کنید که باید در جدول محوری برای رابطه ذخیره شوند:

$user->roles()->attach(1, ['expires' => $expires]);

البته نقطه مقابل این attach است detach :

$user->roles()->detach(1);

هر دو attach و detach همچنین آرایه هایی از شناسه ها را به عنوان ورودی می گیرند:

$user = User::find(1);
 
$user->roles()->detach([1, 2, 3]);
 
$user->roles()->attach([1 => ['attribute1' => 'value1'], 2, 3]);

استفاده از Sync برای پیوست کردن بسیاری از مدل ها به بسیاری از مدل ها

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

$user->roles()->sync([1, 2, 3]);

افزودن داده های محوری هنگام همگام سازی

همچنین می توانید سایر مقادیر جدول محوری را با شناسه های داده شده مرتبط کنید:

$user->roles()->sync([1 => ['expires' => true]]);

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

$role = new Role(['name' => 'Editor']);
 
User::find(1)->roles()->save($role);

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

User::find(1)->roles()->save($role, ['expires' => $expires]);

لمس کردن مهر زمانی والدین

هنگامی که یک مدل belongsTo مدل دیگری، مانند مدلی Comment که متعلق به یک است Post ، به‌روزرسانی مُهر زمانی والدین هنگامی که مدل فرزند به‌روزرسانی می‌شود، اغلب مفید است. به عنوان مثال، هنگامی که یک Comment مدل به روز می شود، ممکن است بخواهید به طور خودکار updated_at مهر زمانی مالکیت را لمس کنید Post . الکوئنت آن را آسان می کند. فقط یک touches ویژگی حاوی نام روابط را به مدل فرزند اضافه کنید:

class Comment extends Model {
 
protected $touches = ['post'];
 
public function post()
{
return $this->belongsTo('App\Post');
}
 
}

اکنون، وقتی یک را به‌روزرسانی می‌کنید Comment ، ستون مالکیت به‌روزرسانی Post می‌شود updated_at :

$comment = Comment::find(1);
 
$comment->text = 'Edit to this comment!';
 
$comment->save();

کار با Pivot Tables

همانطور که قبلاً آموختید، کار با روابط چند به چند مستلزم وجود یک جدول میانی است. Eloquent راه های بسیار مفیدی برای تعامل با این جدول ارائه می دهد. به عنوان مثال، فرض کنید User شی ما دارای اشیاء زیادی است Role که به آنها مربوط می شود. پس از دسترسی به این رابطه، ممکن است به pivot جدول روی مدل ها دسترسی پیدا کنیم:

$user = User::find(1);
 
foreach ($user->roles as $role)
{
echo $role->pivot->created_at;
}

توجه داشته باشید که به هر Role مدلی که بازیابی می کنیم به طور خودکار یک pivot ویژگی اختصاص می یابد. این ویژگی شامل مدلی است که جدول میانی را نشان می دهد و ممکن است مانند هر مدل Eloquent دیگری استفاده شود.

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

return $this->belongsToMany('App\Role')->withPivot('foo', 'bar');

اکنون صفات foo and در شیء ما برای مدل bar قابل دسترسی خواهند بود . pivot Role

اگر می‌خواهید جدول محوری شما به‌طور خودکار دارای مهر created_at و updated_at زمان باشد، withTimestamps از روش تعریف رابطه استفاده کنید:

return $this->belongsToMany('App\Role')->withTimestamps();

حذف رکوردها در جدول محوری

برای حذف تمام رکوردهای جدول محوری یک مدل، می توانید از detach روش زیر استفاده کنید:

User::find(1)->roles()->detach();

توجه داشته باشید که این عملیات رکوردها را از جدول حذف نمی کند roles ، بلکه فقط از جدول محوری حذف می شود.

به روز رسانی یک رکورد در جدول محوری

گاهی اوقات ممکن است لازم باشد جدول محوری خود را به روز کنید، اما آن را جدا نکنید. اگر می خواهید جدول محوری خود را در جای خود به روز کنید، می توانید از updateExistingPivot روشی مانند زیر استفاده کنید:

User::find(1)->roles()->updateExistingPivot($roleId, $attributes);

تعریف یک مدل محوری سفارشی

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

public function newPivot(Model $parent, array $attributes, $table, $exists)
{
return new YourCustomPivot($parent, $attributes, $table, $exists);
}

مجموعه ها

همه مجموعه‌های چند نتیجه‌ای که توسط Eloquent برگردانده می‌شوند، چه از طریق get متد یا یک relationship ، یک شی مجموعه را برمی‌گردانند. این شیء IteratorAggregate رابط PHP را پیاده سازی می کند تا بتوان آن را مانند یک آرایه تکرار کرد. با این حال، این شی همچنین دارای انواع روش های مفید دیگر برای کار با مجموعه نتایج است.

بررسی اینکه آیا یک مجموعه حاوی یک کلید است

به عنوان مثال، ممکن است با استفاده از روش تعیین کنیم که آیا یک مجموعه نتیجه حاوی یک کلید اصلی مشخص است contains :

$roles = User::find(1)->roles;
 
if ($roles->contains(2))
{
//
}

مجموعه ها همچنین ممکن است به آرایه یا JSON تبدیل شوند:

$roles = User::find(1)->roles->toArray();
 
$roles = User::find(1)->roles->toJson();

اگر مجموعه ای به یک رشته فرستاده شود، به صورت JSON برگردانده می شود:

$roles = (string) User::find(1)->roles;

مجموعه های تکراری

مجموعه های Eloquent همچنین حاوی چند روش مفید برای حلقه زدن و فیلتر کردن موارد موجود در آنها هستند:

$roles = $user->roles->each(function($role)
{
//
});

فیلتر کردن مجموعه ها

هنگام فیلتر کردن مجموعه ها، پاسخ تماس ارائه شده به عنوان پاسخ به تماس برای array_filter استفاده می شود .

$users = $users->filter(function($user)
{
return $user->isAdmin();
});

توجه: هنگام فیلتر کردن مجموعه و تبدیل آن به JSON، values ابتدا تابع را فراخوانی کنید تا کلیدهای آرایه بازنشانی شود.

اعمال پاسخ به تماس برای هر شی مجموعه

$roles = User::find(1)->roles;
 
$roles->each(function($role)
{
//
});

مرتب سازی مجموعه بر اساس مقدار

$roles = $roles->sortBy(function($role)
{
return $role->created_at;
});
 
$roles = $roles->sortByDesc(function($role)
{
return $role->created_at;
});

مرتب سازی مجموعه بر اساس مقدار

$roles = $roles->sortBy('created_at');
 
$roles = $roles->sortByDesc('created_at');

بازگرداندن نوع مجموعه سفارشی

گاهی اوقات، ممکن است بخواهید یک شی مجموعه سفارشی را با متدهای اضافه شده خود برگردانید. شما می توانید این را در مدل Eloquent خود با نادیده گرفتن newCollection روش مشخص کنید:

class User extends Model {
 
public function newCollection(array $models = [])
{
return new CustomCollection($models);
}
 
}

لوازم جانبی و تغییردهنده ها

تعریف یک Accessor

Eloquent راه مناسبی برای تغییر ویژگی های مدل شما هنگام دریافت یا تنظیم آنها ارائه می دهد. getFooAttribute به سادگی روشی را در مدل خود برای اعلام یک Accessor تعریف کنید . به خاطر داشته باشید که این روش ها باید از پوشش شتر پیروی کنند، حتی اگر ستون های پایگاه داده شما snake-case هستند:

class User extends Model {
 
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
 
}

در مثال بالا، first_name ستون دارای یک Accessor است. توجه داشته باشید که مقدار ویژگی به Accessor ارسال می شود.

تعریف جهش دهنده

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

class User extends Model {
 
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
 
}

تغییر دهندگان تاریخ

created_at به طور پیش‌فرض، Eloquent ستون‌ها و و updated_at را به نمونه‌هایی از کربن تبدیل می‌کند ، که مجموعه‌ای از روش‌های مفید را ارائه می‌دهد و DateTime کلاس PHP را گسترش می‌دهد.

می‌توانید با نادیده گرفتن getDates روش مدل، فیلدهایی را که به طور خودکار جهش می‌یابند سفارشی کنید و حتی این جهش را کاملاً غیرفعال کنید:

public function getDates()
{
return ['created_at'];
}

هنگامی که یک ستون به عنوان تاریخ در نظر گرفته می شود، می توانید مقدار آن را روی مهر زمانی یونیکس، رشته تاریخ ( Y-m-d )، رشته تاریخ-زمان و البته یک نمونه DateTime / تنظیم کنید Carbon .

برای غیرفعال کردن کامل جهش های تاریخ، به سادگی یک آرایه خالی از getDates متد را برگردانید:

public function getDates()
{
return [];
}

ویژگی ریخته گری

اگر ویژگی هایی دارید که می خواهید همیشه آنها را به نوع داده دیگری تبدیل کنید، می توانید ویژگی را به ویژگی casts مدل خود اضافه کنید. در غیر این صورت، باید برای هر یک از ویژگی ها یک mutator تعریف کنید که می تواند زمان بر باشد. در اینجا نمونه ای از استفاده از casts ملک آورده شده است:

/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'is_admin' => 'boolean',
];

اکنون is_admin مشخصه همیشه هنگام دسترسی به آن به یک Boolean فرستاده می شود، حتی اگر مقدار اساسی در پایگاه داده به عنوان یک عدد صحیح ذخیره شود. سایر انواع بازیگران پشتیبانی شده عبارتند از: integer , real , float , double , string , boolean , object و array .

بازیگران array به ویژه برای کار با ستون هایی که به صورت سریال JSON ذخیره می شوند مفید است. به عنوان مثال، اگر پایگاه داده شما دارای یک فیلد از نوع TEXT است که حاوی JSON سریالی است، افزودن array cast به آن ویژگی، هنگامی که در مدل Eloquent خود به آن دسترسی پیدا می‌کنید، به طور خودکار ویژگی را به یک آرایه PHP از فهرست خارج می‌کند:

/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'options' => 'array',
];

حالا وقتی از مدل Eloquent استفاده می کنید:

$user = User::find(1);
 
// $options is an array...
$options = $user->options;
 
// options is automatically serialized back to JSON...
$user->options = ['foo' => 'bar'];

رویدادهای مدل

مدل‌های Eloquent چندین رویداد را اجرا می‌کنند و به شما امکان می‌دهند با استفاده از روش‌های زیر به نقاط مختلف چرخه عمر مدل متصل شوید: creating , created , updating , , updated , saving , saved , deleting , deleted , restoring . restored

هر زمان که یک مورد جدید برای اولین بار ذخیره شود، creating و created رویدادها فعال می شوند. اگر آیتمی جدید نباشد و save متد فراخوانی شود، updating / updated رویدادها فعال می شوند. در هر دو مورد، رویدادهای saving / saved فعال می شوند.

لغو ذخیره عملیات از طریق رویدادها

اگر از , , , یا رویدادها false برگردانده شود ، اقدام لغو خواهد شد: creating updating saving deleting

User::creating(function($user)
{
if ( ! $user->isValid()) return false;
});

محل ثبت شنوندگان رویداد

شما EventServiceProvider به عنوان مکانی مناسب برای ثبت پیوندهای رویداد مدل خود عمل می کند. مثلا:

/**
* Register any other events for your application.
*
* @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
public function boot(DispatcherContract $events)
{
parent::boot($events);
 
User::creating(function($user)
{
//
});
}

ناظران مدل

برای ادغام مدیریت رویدادهای مدل، می‌توانید یک ناظر مدل ثبت کنید. یک کلاس ناظر ممکن است متدهایی داشته باشد که با رویدادهای مدل مختلف مطابقت دارند. برای مثال creating ،،، متدها ممکن است علاوه بر هر نام رویداد مدل دیگری روی یک ناظر باشند updating . saving

بنابراین، برای مثال، یک ناظر مدل ممکن است به شکل زیر باشد:

class UserObserver {
 
public function saving($model)
{
//
}
 
public function saved($model)
{
//
}
 
}

می توانید با استفاده از observe روش زیر یک نمونه ناظر را ثبت کنید:

User::observe(new UserObserver);

مدل تولید URL

هنگامی که مدلی را به روش route یا action متدها ارسال می کنید، کلید اصلی آن در URI تولید شده درج می شود. مثلا:

Route::get('user/{user}', 'UserController@show');
 
action('UserController@show', [$user]);

در این مثال ویژگی در مکان نگهدار URL تولید شده $user->id درج می شود . {user} با این حال، اگر می خواهید به جای شناسه از ویژگی دیگری استفاده کنید، می توانید getRouteKey روش را در مدل خود لغو کنید:

public function getRouteKey()
{
return $this->slug;
}

تبدیل به آرایه / JSON

تبدیل مدل به آرایه

هنگام ساختن API های JSON، ممکن است نیاز داشته باشید که مدل ها و روابط خود را به آرایه یا JSON تبدیل کنید. بنابراین، Eloquent شامل روش هایی برای انجام این کار است. برای تبدیل یک مدل و رابطه بارگذاری شده آن به یک آرایه، می توانید از toArray روش زیر استفاده کنید:

$user = User::with('roles')->first();
 
return $user->toArray();

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

return User::all()->toArray();

تبدیل مدل به JSON

برای تبدیل یک مدل به JSON، می توانید از toJson روش زیر استفاده کنید:

return User::find(1)->toJson();

بازگشت یک مدل از یک مسیر

توجه داشته باشید که وقتی یک مدل یا مجموعه به یک رشته ارسال می شود، به JSON تبدیل می شود، به این معنی که می توانید اشیاء Eloquent را مستقیماً از مسیرهای برنامه خود برگردانید!

Route::get('users', function()
{
return User::all();
});

پنهان کردن ویژگی ها از تبدیل آرایه یا JSON

گاهی اوقات ممکن است بخواهید ویژگی هایی را که در آرایه مدل یا فرم JSON شما گنجانده شده است، مانند رمزهای عبور، محدود کنید. برای انجام این کار، یک hidden تعریف ویژگی به مدل خود اضافه کنید:

class User extends Model {
 
protected $hidden = ['password'];
 
}

توجه: هنگام پنهان کردن روابط، از نام روش رابطه استفاده کنید ، نه از نام دسترسی پویا.

از طرف دیگر، می توانید از visible ویژگی برای تعریف یک لیست سفید استفاده کنید:

protected $visible = ['first_name', 'last_name'];

گاهی اوقات، ممکن است لازم باشد ویژگی های آرایه ای را اضافه کنید که ستون مربوطه در پایگاه داده شما ندارند. برای انجام این کار، به سادگی یک Accessor برای مقدار تعریف کنید:

هنگامی که Accessor را ایجاد کردید، فقط مقدار را به appends ویژگی روی مدل اضافه کنید:

protected $appends = ['is_admin'];

هنگامی که ویژگی به لیست اضافه شد appends ، هم در آرایه مدل و هم در فرم JSON گنجانده می شود. ویژگی های موجود در آرایه به پیکربندی و پیکربندی مدل appends احترام می گذارند . visible hidden