نیما
4 سال پیش توسط نیما مطرح شد
3 پاسخ

روش صحیح sync جدول واسط

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

category_id|  post_id | pad_id
-----------|----------|--------
 1         |        1 |      3
 1         |        2 |      1
 2         |        3 |      2

نکته: وقتی pad_id رو اپدیت میکنم درست کار میکنه کد

array:3 [▼
"attached" => []
"detached" => []
"updated" => array:1 [▶]
]

اما وقتی category_id رو اپدیت میکنم ردیف جدید ایجاد میکنه و ردیف قبلی رو حذف میکنه

array:3 [▼
"attached" => array:1 [▶]
"detached" => array:1 [▶]
"updated" => []
 ]

Post Model

public function categories()
{ 
 return $this->belongsToMany(Category::class,'category_post_pad','post_id','category_id')->withPivot('pad_id');
}

public function pads()
{
return $this->belongsToMany(Pad::class,'category_post_pad','post_id','pad_id');
}

category model:

public function posts()
{
    return $this->belongsToMany(Post::class,'category_post_pad','category_id','post_id');

}

pad model:

public function posts()
{
    return $this->belongsToMany(Post::class,'category_post_pad','pad_id','post_id');

}

PostsController

public function update(Request $request, $id)
{
    $$post = Post::findOrFail($id);
    $post = $request->all();
    $post->update($data);
    if ($post) {
        $category = $request->input('categories');
        $pad = $request->input('pad');
        $post->categories()->sync(array( $category=> array( 'pad_id' => $pad)));
        return redirect()->back;
    }
}

ثبت پرسش جدید
محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش مطرح شد
1

سلام.
Sync کلا دوتا سطر یکسان(صرفا کلیدهای خارجی رو درنظر میگیره بر ای مقایسه برابری) دراون وجود داشته باشه حذفشون میکنه و rewrite میکنه و این کار sync هستش اما اگر می‌خواهید سطر جدیدی اضافه کنید بدون اینکه سطر های مورد نظر حذف شوند از syncWithoutDetaching به جای Sync استفاده کنید ولی اگه میخواهید سطرهای خاصی رو صرفا به روز کنید میتونید یک مدل خاص تعریف و به جدول واسط نسبت بدید و با اون کار به روز کردن سطر هارو انجام بدید.


نیما
@shadecute3 4 سال پیش آپدیت شد
0

@mohammadeng3731
ممنون از پاسخ شما
راستش اصلا کار خاصی مد نظرم نیست فقط میخوام جدول با همین sync بروز بشه
من وقتی وارد صفححه ویرایش پست میشم دوتا گزینه برام هست انتخاب 2 تا کتگوری
اگر این دوتا فیلد رو عوض خواستم بکنم نه ردیف حذف بشه نه ایجاد بشه ( چون قبلا در زمان ارسال پست ایجاد شده ) فقط میخوام ویرایش بشه
کد هامم کامل بالا گذاشتم اما واقعا نمی دونم کجای کارم اشکال داره نمیشه🤕

category_id|  post_id | pad_id
-----------|----------|--------
 1         |        1 |      3
 1         |        2 |      1
 2         |        3 |      2

در زمان ویرایش پست در نمونه جدول بالا post_id همیشه ثابت هست و ویرایش نمیشه اما ممکنه هر یک از pad_id و باcategory_id بروز بشن یا هردو باهم بروز بشن همزمان کدمم طبق آموزشا نوشتم ولی همون مواردی که بالا توضیح دادم پیش میاد


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 4 سال پیش مطرح شد
1

سلام و شب بخیر . @shadecute3
شاید سوالتون رو بد متوجه شده باشم. ( بخاطر خستگی کار با سیستم تا دو شب تقریبا تمرکزی باقی نمونده ! 😅 )
فک میکنم شما میخواید بجای اینکه مواردی مثل Sync/Detach/Attach بیاین و یک row از جدول میانی رو Update کنید.
چیزی که حدس میزنم کمکتون میکنه تصویر زیر هست . البته لینک مستندات رو هم میذارم اگر مطالعه کنید موارد جالبی خواهید یافت. در نهایت اگر سرچ بزنید داخل نت راجب همین متد ها و update pivot table row احتمالا به جواب برسید.( مخصوصا فروم های لاراکست که لینک یکی از موارد شبیه شمارو قرار دادم )
laravel update pivot table row!


https://laravel.com/docs/7.x/eloquent-relationships#updating-many-to-many-relationships
https://laracasts.com/discuss/channels/general-discussion/updating-a-recorde-on-a-pivot-table

موفق باشید .🌹


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام