نسخه:

الکوئنت: مجموعه ها

معرفی

همه متدهای Eloquent که بیش از یک نتیجه مدل را برمی‌گردانند، نمونه‌هایی از کلاس را برمی‌گردانند Illuminate\Database\Eloquent\Collection ، از جمله نتایج بازیابی شده از طریق get متد یا دسترسی به آنها از طریق یک رابطه. شی مجموعه Eloquent مجموعه پایه لاراول را گسترش می دهد ، بنابراین به طور طبیعی ده ها روش مورد استفاده برای کار روان با آرایه زیرین مدل های Eloquent را به ارث می برد. حتما اسناد مجموعه لاراول را مرور کنید تا همه چیز را در مورد این روش های مفید بدانید!

همه مجموعه‌ها همچنین به عنوان تکرارکننده عمل می‌کنند، و به شما امکان می‌دهند تا روی آنها حلقه بزنید، گویی آرایه‌های ساده PHP هستند:

use App\Models\User;
 
$users = User::where('active', 1)->get();
 
foreach ($users as $user) {
echo $user->name;
}

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

$names = User::all()->reject(function (User $user) {
return $user->active === false;
})->map(function (User $user) {
return $user->name;
});

تبدیل مجموعه الکوئنت

در حالی که اکثر متدهای مجموعه Eloquent یک نمونه جدید از یک مجموعه Eloquent را برمی‌گردانند، متدهای collapse , flatten , , , و یک نمونه مجموعه پایه را برمی‌گردانند . به همین ترتیب، اگر یک عملیات مجموعه‌ای را برگرداند که شامل مدل‌های Eloquent نیست، به یک نمونه مجموعه پایه تبدیل می‌شود. flip keys pluck zip map

روش های موجود

همه مجموعه‌های Eloquent شیء مجموعه لاراول پایه را گسترش می‌دهند . بنابراین، آنها تمام متدهای قدرتمند ارائه شده توسط کلاس مجموعه پایه را به ارث می برند.

علاوه بر این، Illuminate\Database\Eloquent\Collection کلاس مجموعه‌ای از روش‌ها را برای کمک به مدیریت مجموعه‌های مدل ارائه می‌کند. اکثر روش ها Illuminate\Database\Eloquent\Collection نمونه هایی را برمی گرداند. با این حال، برخی از روش ها، مانند modelKeys ، یک Illuminate\Support\Collection نمونه را برمی گرداند.

append($attributes)

این append روش ممکن است برای نشان دادن اینکه یک ویژگی باید برای هر مدل در مجموعه اضافه شود استفاده شود. این روش آرایه ای از ویژگی ها یا یک ویژگی واحد را می پذیرد:

$users->append('team');
 
$users->append(['team', 'is_admin']);

contains($key, $operator = null, $value = null)

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

$users->contains(1);
 
$users->contains(User::find(1));

diff($items)

این diff متد همه مدل هایی را که در مجموعه داده شده وجود ندارند برمی گرداند:

use App\Models\User;
 
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());

except($keys)

متد except تمام مدل هایی را که کلیدهای اولیه داده شده را ندارند برمی گرداند:

$users = $users->except([1, 2, 3]);

find($key)

متد find مدلی را برمی‌گرداند که دارای یک کلید اولیه مطابق با کلید داده شده است. اگر $key یک نمونه مدل است، find سعی خواهد کرد مدلی مطابق با کلید اصلی را برگرداند. اگر $key آرایه ای از کلیدها باشد، find تمام مدل هایی را که دارای کلید اصلی در آرایه داده شده هستند، برمی گرداند:

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

fresh($with = [])

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

$users = $users->fresh();
 
$users = $users->fresh('comments');

intersect($items)

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

use App\Models\User;
 
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());

load($relations)

روش load مشتاق روابط داده شده را برای همه مدل های مجموعه بارگذاری می کند:

$users->load(['comments', 'posts']);
 
$users->load('comments.author');
 
$users->load(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);

loadMissing($relations)

متد loadMissing eager روابط داده شده را برای همه مدل‌های مجموعه بارگذاری می‌کند، اگر روابط قبلاً بارگذاری نشده باشند:

$users->loadMissing(['comments', 'posts']);
 
$users->loadMissing('comments.author');
 
$users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);

modelKeys()

متد modelKeys کلیدهای اصلی را برای همه مدل‌های مجموعه برمی‌گرداند:

$users->modelKeys();
 
// [1, 2, 3, 4, 5]

makeVisible($attributes)

این makeVisible روش ویژگی هایی را قابل مشاهده می کند که معمولاً در هر مدل در مجموعه "پنهان" هستند:

$users = $users->makeVisible(['address', 'phone_number']);

makeHidden($attributes)

این makeHidden روش ویژگی هایی را پنهان می کند که معمولاً در هر مدل در مجموعه "قابل مشاهده" هستند:

$users = $users->makeHidden(['address', 'phone_number']);

only($keys)

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

$users = $users->only([1, 2, 3]);

setVisible($attributes)

این setVisible روش به طور موقت تمام ویژگی های قابل مشاهده در هر مدل در مجموعه را لغو می کند :

$users = $users->setVisible(['id', 'name']);

setHidden($attributes)

این setHidden روش به طور موقت تمام ویژگی های پنهان در هر مدل در مجموعه را لغو می کند :

$users = $users->setHidden(['email', 'password', 'remember_token']);

toQuery()

این toQuery روش یک نمونه سازنده پرس و جوی Eloquent را برمی‌گرداند که شامل یک whereIn محدودیت در کلیدهای اولیه مدل مجموعه است:

use App\Models\User;
 
$users = User::where('status', 'VIP')->get();
 
$users->toQuery()->update([
'status' => 'Administrator',
]);

unique($key = null, $strict = false)

این unique روش همه مدل‌های منحصربه‌فرد مجموعه را برمی‌گرداند. هر مدلی از همان نوع با کلید اصلی مشابه با مدل دیگری در مجموعه حذف می شود:

$users = $users->unique();

مجموعه های سفارشی

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

<?php
 
namespace App\Models;
 
use App\Support\UserCollection;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
/**
* Create a new Eloquent Collection instance.
*
* @param array<int, \Illuminate\Database\Eloquent\Model> $models
* @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model>
*/
public function newCollection(array $models = []): Collection
{
return new UserCollection($models);
}
}

هنگامی که یک روش را تعریف کردید newCollection ، هر زمانی که Eloquent به طور معمول یک نمونه را برگرداند، نمونه ای از مجموعه سفارشی خود را دریافت خواهید کرد Illuminate\Database\Eloquent\Collection . اگر می خواهید از یک مجموعه سفارشی برای هر مدل در برنامه خود استفاده کنید، باید متد را newCollection بر روی یک کلاس مدل پایه تعریف کنید که توسط همه مدل های برنامه شما گسترش یافته است.