ORM الکوئنت
- معرفی
- استفاده پایه
- تکلیف انبوه
- درج، به روز رسانی، حذف
- حذف نرم
- مهر زمانی
- محدوده های پرس و جو
- دامنه های جهانی
- روابط
- روابط پرس و جو
- مشتاق بارگیری
- درج مدل های مرتبط
- لمس کردن مهر زمانی والدین
- کار با Pivot Tables
- مجموعه ها
- لوازم جانبی و تغییردهنده ها
- تغییر دهندگان تاریخ
- ویژگی ریخته گری
- رویدادهای مدل
- ناظران مدل
- مدل تولید URL
- تبدیل به آرایه / JSON
معرفی
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