TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 611 subscribers
Post #319 168
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت چهارم

1- متد attach
برای افزودن رکوردهای جدید به جدول واسط (pivot table) استفاده می‌شود. با این متد می‌توانید رابطه‌های جدیدی را بین مدل اصلی و مدل مرتبط ایجاد کنید.
$user = User::find(1);
$user->roles()->attach([1, 2]);

نقش‌های 1 و 2 به کاربر شماره 1 اختصاص داده می‌شوند و این رابطه‌ها در جدول واسط (role_user) اضافه می‌شوند.

همچنین می‌توانید داده‌های اضافی به جدول واسط نیز اضافه کنید:
$user->roles()->attach(1, ['assigned_at' => now()]);


2- متد detach
برای حذف رابطه‌های موجود در جدول واسط استفاده می‌شود. این متد می‌تواند رابطه‌های مرتبط با مدل فعلی را از مدل‌های دیگر حذف کند.
$user = User::find(1);
$user->roles()->detach(2);

نقش شماره 2 از کاربر شماره 1 حذف می‌شود.

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

- اگر شناسه‌ای در لیست وجود داشته باشد که قبلاً با مدل مرتبط نبوده، آن شناسه اضافه می‌شود.

- اگر شناسه‌ای در لیست نباشد، و قبلاً مرتبط بوده، آن شناسه حذف می‌شود.

- شناسه‌هایی که هم اکنون با مدل مرتبط هستند و در لیست جدید نیز وجود دارند، دست نخورده باقی می‌مانند.
$user = User::find(1);
$user->roles()->sync([1, 3]);

بسته به شرایط توضیح داده شده روابط از جدول واسط، حذف/اضافه یا ویرایش می شوند.

این متد آرایه‌ای از رکوردهای attached, detached, و updated را برمی‌گرداند، که گزارشی از تغییرات روی روابط است.

4- متد syncWithPivotValues
مشابه sync عمل می‌کند، اما به شما امکان می‌دهد داده‌های اضافی را در جدول واسط تنظیم کنید. هر بار که رابطه همگام‌سازی می‌شود، می‌توانید مقادیر داده‌های اضافی را نیز ارائه دهید.
$user = User::find(1);
$user->roles()->syncWithPivotValues([1, 2], ['assigned_at' => now()]);

نقش‌های 1 و 2 همگام‌سازی می‌شوند و ستون assigned_at برای هر رابطه به زمان فعلی تنظیم می‌شود.

5- متد syncWithoutDetaching
همانند sync عمل می‌کند، با این تفاوت که رابطه‌های فعلی را حذف نمی‌کند و فقط رکوردهای جدید را اضافه می‌کند.

6- متد toggle
نقش‌ها را اضافه می‌کند اگر وجود نداشته باشند و حذف می‌کند اگر وجود داشته باشند. به عبارتی دیگر، نقش‌ها را روشن و خاموش می‌کند.
$user = User::find(1);
$user->roles()->toggle([1, 2]);


7- متد updateExistingPivot
برای به‌روزرسانی داده‌های جدول واسط برای یک رابطه موجود استفاده می‌شود. این متد رکوردهای مرتبط را در جدول واسط به‌روزرسانی می‌کند.
$user = User::find(1);
$user->roles()->updateExistingPivot(1, ['assigned_at' => now()]);

مقدار assigned_at برای نقش شماره 1 به روز شده است.

8- متد push
تمام تغییرات انجام‌شده روی مدل فعلی و مدل‌های مرتبط آن را به پایگاه داده ذخیره می‌کند. این متد به شما امکان می‌دهد چندین تغییر را به طور همزمان ذخیره کنید.
$user = User::find(1);
$user->name = "John Updated";
$user->roles[0]->name = "Admin Updated";
$user->push();

هم تغییرات اعمال‌شده روی مدل اصلی (user) و هم تغییرات مربوط به مدل‌های مرتبط (roles) ذخیره می‌شوند.

9- متد pushQuietly
مشابه push است، اما بدون اجرای رویدادهای مربوطه، مدل را ذخیره می‌کند.

نکته: دو متد بعدی مربوط به روابط One-to-Many و Many-to-One می باشند.

10- متد associate
برای برقراری ارتباط بین یک رکورد فرزند و یک رکورد والد استفاده می‌شود. با associate، کلید خارجی در مدل فرزند تنظیم می‌شود تا به رکورد والد مرتبط شود.
$post = Post::find(1); 
$user = User::find(1);

$post->user()->associate($user);
$post->save();

با استفاده از associate، کلید خارجی user_id در جدول posts به شناسه کاربر تنظیم می‌شود.

11- متد dissociate
برای قطع ارتباط بین یک رکورد فرزند و رکورد والد استفاده می‌شود. این متد کلید خارجی در مدل فرزند را حذف (null) می‌کند و رابطه را از بین می‌برد.
$post = Post::find(1); 

$post->user()->dissociate();
$post->save()

با استفاده از dissociate، کلید خارجی user_id در جدول posts به مقدار null تنظیم می‌شود.

از قسمت بعد به سایر روابط می پردازیم.

▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.
  • ❤ 1
  • 👍 1
More from @amirhdeveloper
  1. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  2. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  3. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  4. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  5. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
  6. Sep 19, 2026خیلی وقته پست‌های کانال فقط درمورد LaraGram بوده، وقتشه یکم جالب‌ترش کنیم اگر ممبرها هنوز…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →