یه رابطه جدید الکوئنت (Eloquent) در لاراول ورژن 8.42 به اسم One of Many اضافه شد. رابطه one-of-many، یه رابطه one-to-one وابسته به one-to-many ایجاد میکنه. برای مثال، آخرین و اولین ورود یا قیمت گذاری محصول (مثلا آخرین قیمت ثبت شده برای یه محصول) رو میتونید با استفاده از این رابطه برقرار کنید.
این رابطه محل تلاقی رابطه جوین شده رو فیلتر میکنه. یه کوئری SQL از درخواست پشت پرده رو با هم میبینیم تا درک بهتری از نحوه کار این رابطه داشته باشیم:
SELECT *
FROM `logins`
INNER JOIN (
SELECT MAX(id) AS id
FROM logins
GROUP BY logins.user_id
) AS latest_login
ON latest_login.id = logins.id
در ادامه برای مثال میخوایم یه رابطه بین مدل User که تعداد زیادی ورود به سیستم داره پیاده سازی کنیم. توی این مثال میخوایم از الکوئنت و رابطه One of Many استفاده کنیم:
class User extends Model
{
public function latest_login()
{
return $this->hasOne(Login::class)->ofMany();
}
}
توی کد بالا رابط مرتبط ofMany وجود داره که به صورت زیر نوشته شده:
interface SupportsPartialRelations
{
/**
* Indicate that the relation is a single result of a larger one-to-many relationship.
*
* @param string|array|null $column
* @param string|Closure|null $aggregate
* @param string|null $relation
*/
public function ofMany($column = 'id', $aggregate = 'MAX', $relation = null);
/**
* Determine whether the relationship is a one-of-many relationship.
*
* @return bool
*/
public function isOneOfMany();
}
اگه دنبال توضیح بیشتری در این روابط هستید، باید بهتون بگم که در روابط عمومی (PR) از دو روش کمکی استفاده میکنه:
$this->hasOne(Login::class)->latestOfMany();
$this->hasOne(Login::class)->oldestOfMany();
مستندات این رابطه به زودی در لاراول ارائه میشه. پس در حال حاضر بهترین مکان برای کسب اطلاعات بیشتر در مورد One of Many داخل توضیحات و بحث و گفتگو های درخواست Pull Request #37362 گیت هاب هستش. یه سری راه حل برای اشکالاتی که در استفاده از hasOne برای این نوع روابط پیش اومده،مطرح شده. این تجربیات بهتون کمک میکنه که بدونید دقیقا کی باید از اون استفاده کنید. (شاید هنوز برای استفاده زود باشه)
داخل گیت هاب کاربر cbl/laravel-one-of-many مثال هایی که روی مدل User زده رو میتونید ببینید و الگو برداری کنید.
منبع : laravel-news.com