Paradox 3 گزارش دادن ارسال شده در دی 1 سلام وقت بخیر من میخام کاربران مورد علاقه به سایت اضافه کنم باید از روش morph استفاده کرد درسته ؟ من هرچی سرچ زدم لایک و علاقه مندی برای پست و مقالات بود من میخام برای کاربران باشه یعنی از بین کاربران اونایی که مورد علاقه هستند لایک و دیسلایک اضافه کنم این لینک هایی که گذاشتم ایا مثل این انجام بدم و جدول post در نظر نگیرم میتونم به جواب برسم یا متفاوت هست ؟ لینک و این لینک نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در دی 1 سلام منطق کار یکی هست و مهم نیست برای پست و مقاله بوده باشه روش کار یکیه از همونها میتونید الگو برداری کنید حالا جایی باز مشکلی داشتید میتونید مشکل رو مطرح کنید نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در دی 1 در 23 ساعت قبل، saber گفته است : سلام منطق کار یکی هست و مهم نیست برای پست و مقاله بوده باشه روش کار یکیه از همونها میتونید الگو برداری کنید حالا جایی باز مشکلی داشتید میتونید مشکل رو مطرح کنید به یه روشی انجام دادم ولی جواب درستی نگرفتم هر دفعه که روی دکمه favorite کلیک میکنم فقط برای ایدی خودم هر دفعه تو دیتابیس ثبت میشه و unfavorite که میزنم ارور زیر دارم Call to a member function delete() on null جدول من Schema::create('favorites', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->timestamps(); }); مدل favorite class Favorite extends Model { protected $fillable = [ 'user_id', ]; public function user() { return $this->belongsTo(User::class); } } مدل user public function favorites() { return $this->hasMany(Favorite::class); } public function is_favorite_by_auth_user() { $id = Auth::id(); $favorites = array(); foreach($this->favorites as $favorite): array_push($favorites , $favorite->user_id); endforeach; if(in_array($id , $favorites)) { return true; } else { return false; } route Route::get('/profile/favorite/{favorite}' , [IndexController::class , 'favorite'])->name('favorite'); Route::get('/profile/unfavorite/{favorite}' , [IndexController::class , 'unFavorite'])->name('unFavorite'); controller public function favorite(Request $request , User $favorite) { Favorite::create([ 'id' => $favorite->id , 'user_id' => Auth::id() , ]); return back(); } public function unFavorite(User $favorite) { $favorite = Favorite::where('id' , $favorite->id)->where('user_id' , Auth::id())->first(); $favorite->delete(); return back(); } blade @if ($user->is_favorite_by_auth_user()) <a href="{{ route('profile.unFavorite' , $user->id ) }}" > <i class="fa fa-star text-warning"></i> </a> @else <a href="{{ route('profile.favorite' , $user->id ) }}"> <i class="fa fa-star text-black"></i> </a> @endif مشکل کارم تو کنترلره ؟؟ اگه بخوام بدون رفرش شدن صفحه انجام بدم از ajax باید استفاده کنم؟ نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در دی 1 به یه روش دیگه هم انجام دادم از طریق ایجکس ولی جواب نگرفتم کنترلر public function store(User $user) { $user->favorites()->toggle( auth()->user()->id ); return response(['ok'], 200); } روت Route::middleware('auth')->post('/profile/favorite/{user}', [IndexController::class, 'store'])->name('favorite'); بلید <span class="single-page__favorite @if($user->is_user_favorite) single-page__favorite--is-active @endif"></span> اسکریپت <script> $(".single-page__favorite").on("click", function () { fetch('{{ route("favorite", $user->id) }}', { method: 'post', headers: { 'X-CSRF-Token': '{{ csrf_token() }}' } }).then((response) => { if(response.ok) { $(this).toggleClass("single-page__favorite--is-active"); } }) }) </script> سی اس اس .single-page__favorite::before { content: '★'; font-size: 25px; padding-bottom: 25px; } .single-page__favorite--is-active::before { content: ''; } مدل یوزر public function favorites() { return $this->hasMany(Favorite::class); } public function getIsUserFavoritesAttribute() { return $this->favorites()->where('user_id', auth()->user()->id)->exists(); } مدل favorite protected $fillable = [ 'user_id', ]; public function user() { return $this->belongsTo(User::class); } اشکال کارم کجاست؟ تو consol به این خط از جی اس ارور میده fetch('http://localhost:8000/profile/favorite/2', { نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در دی 1 یه مشکلی که دارید داخل متد is_favorite_by_auth_user شناسه کاربری رو که لاگین کرده با کد Auth::id دریافت میکنید و در داخل آرایه کاربران جستجو میزنید که این اشتباه هست شما باید لیست کاربران دلخواه کاربری رو که لاگین کرده دریافت کنید بعد باید چک کنید شناسه پروفایل کاربری که ازش بازدید میکنید در بین این شناسه ها وجود داره یا خیر مثلا به این شکل میشود: $login_user_favorites = [آرایه ای از کاربرانی که قبلا در لیست خود قرار داده]; $user_id = شناسه کاربری که در حال بازدید پروفایلش هستید; return in_array($user_id,$login_user_favorites); در کد بالا اگر شناسه کاربری که از پروفایلش بازدید میکنیم در لیست کاربران دلخواه کاربر لاگین شده موجود باشه true برمیگرده در غیراینصورت false برمیگرده. در مورد این هم که بدون رفرش باشه حتما باید ajax کار کنید نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 در 22 ساعت قبل، Paradox گفته است : به یه روش دیگه هم انجام دادم از طریق ایجکس ولی جواب نگرفتم کنترلر public function store(User $user) { $user->favorites()->toggle( auth()->user()->id ); return response(['ok'], 200); } روت Route::middleware('auth')->post('/profile/favorite/{user}', [IndexController::class, 'store'])->name('favorite'); بلید <span class="single-page__favorite @if($user->is_user_favorite) single-page__favorite--is-active @endif"></span> اسکریپت <script> $(".single-page__favorite").on("click", function () { fetch('{{ route("favorite", $user->id) }}', { method: 'post', headers: { 'X-CSRF-Token': '{{ csrf_token() }}' } }).then((response) => { if(response.ok) { $(this).toggleClass("single-page__favorite--is-active"); } }) }) </script> سی اس اس .single-page__favorite::before { content: '★'; font-size: 25px; padding-bottom: 25px; } .single-page__favorite--is-active::before { content: ''; } مدل یوزر public function favorites() { return $this->hasMany(Favorite::class); } public function getIsUserFavoritesAttribute() { return $this->favorites()->where('user_id', auth()->user()->id)->exists(); } مدل favorite protected $fillable = [ 'user_id', ]; public function user() { return $this->belongsTo(User::class); } اشکال کارم کجاست؟ تو consol به این خط از جی اس ارور میده fetch('http://localhost:8000/profile/favorite/2', { ممنون مهندس برای این روش که با ایجکس هست مشکل کارم کجاست؟ نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 در ۱ ساعت قبل، Paradox گفته است : ممنون مهندس برای این روش که با ایجکس هست مشکل کارم کجاست؟ خطایی که گفتید در کنسول هست توی صفحه جیکوئری رو لود کردید؟ ممکنه بخاطر لود نشدن جیکوئری بهتون خطا داده باشه. و اینکه الان توی متد ذخیره شما شناسه کاربری که پروفایلش مشاهده شده رو ذخیره نمیکنید و فقط شناسه کاربر لاگین شده رو ارسال میکنید نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 در 12 ساعت قبل، saber گفته است : خطایی که گفتید در کنسول هست توی صفحه جیکوئری رو لود کردید؟ ممکنه بخاطر لود نشدن جیکوئری بهتون خطا داده باشه. و اینکه الان توی متد ذخیره شما شناسه کاربری که پروفایلش مشاهده شده رو ذخیره نمیکنید و فقط شناسه کاربر لاگین شده رو ارسال میکنید بله جیکوئری لود شده این لاین به این شکل باید باشه ؟ public function getIsUserFavoritesAttribute(User $user) { return $this->favorites()->where('user_id', $user->id)->exists(); } نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 در در ۱۴۰۱/۱۱/۱ در 00:54، saber گفته است : یه مشکلی که دارید داخل متد is_favorite_by_auth_user شناسه کاربری رو که لاگین کرده با کد Auth::id دریافت میکنید و در داخل آرایه کاربران جستجو میزنید که این اشتباه هست شما باید لیست کاربران دلخواه کاربری رو که لاگین کرده دریافت کنید بعد باید چک کنید شناسه پروفایل کاربری که ازش بازدید میکنید در بین این شناسه ها وجود داره یا خیر مثلا به این شکل میشود: $login_user_favorites = [آرایه ای از کاربرانی که قبلا در لیست خود قرار داده]; $user_id = شناسه کاربری که در حال بازدید پروفایلش هستید; return in_array($user_id,$login_user_favorites); در کد بالا اگر شناسه کاربری که از پروفایلش بازدید میکنیم در لیست کاربران دلخواه کاربر لاگین شده موجود باشه true برمیگرده در غیراینصورت false برمیگرده. در مورد این هم که بدون رفرش باشه حتما باید ajax کار کنید مهندس اینجا تو این تابع به چه شکل بنویسم دقیقا ؟ متاسفانه نتونستم حلش کنم public function is_favorite_by_auth_user() { $id = Auth::id(); $favorites = array(); foreach($this->favorites as $favorite): array_push($favorites , $favorite->user_id); endforeach; if(in_array($id , $favorites)) { return true; } else { return false; } نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 یکم تغییر دادم جدول رو به این شکل نوشتم $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->boolean('favorite')->default(0); تو کنترلر به این شکل نوشتم مشکلی که دارم وقتی روی دکمه favorite کاربر مثلا ایدی 2 میزنم تو دیتابیس ثبت میشه ولی تو ظاهر بلید تغییری نمیکنه ولی وقتی روی دکمه favorite ایدی که خودم لاگین کردم میزنم هم تو دیتابیس ثبت میشه هم تو بلید ظاهرش تغییر میکنه public function favorite(User $favorite) { Favorite::create([ 'favorite' => 1 , 'user_id' => $favorite->id, ]); return back(); } public function unFavorite(Request $request , User $favorite) { $deletd = Favorite::where('id', auth()->user()->id)->where('user_id' , $favorite->id)->update([ 'favorite' => 0 ]); // $favorite = Favorite::where('id' , $favorite->id)->where('user_id' , $favorite->id)->first(); // $favorite->delete(); return back(); } نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 مشکل unfavorite حل کردم فقط نمیدونم تو این متد به چه شکل بنویسم که فقط برای ایدی خودم ایکون تغییر نکنه و برای همه کاربران اعمال بشه is_favorite_by_auth_user نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 این شکلی درسته ؟ برای ایدی خودم فقط حذف کار میکنه public function favorite(User $favorite) { Favorite::create([ 'favorite' => 1 , 'user_id' => $favorite->id, ]); return back(); } public function unFavorite(Request $request , User $favorite) { $favorite = Favorite::where('user_id' , $favorite->id)->first(); $favorite->delete(); return back(); } نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 من یه توضیح کلی براتون مینویسم بررسی کنید و از روی اون پیاده سازی کنید. اگه فقط برای model کاربران میخواید اینکار انجام بشه ساده ترین روش این هست که یه جدول مثلا به اسم favorites بسازید با مایگریشن زیر Schema::create('favorites', function (Blueprint $table) { $table->bigIncrements('id'); $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->foreignId('favorite_user_id')->constrained('users','id')->onDelete('cascade'); $table->timestamp('added_date')->default(DB::raw('CURRENT_TIMESTAMP')); }); بعد برای اضافه کردن به لیست و حذف یه کاربر از لیست میتونید متدهای زیر رو بنویسید من اینها رو با api نوشته بودم شما میتونید بدون api هم بنویسید // add user to favorite list public function add(Request $request) { $favorite_user_id = $request->get('user_id'); // شناسه کاربری هست که کاربر لاگین شده در سایت آنرا در لیست مورد دلخواه قرار میدهد $favorite = Favorite::create([ 'user_id' => auth()->user()->id, 'favorite_user_id' => $favorite_user_id, 'added_date' => Carbon::now() ]); // return your response } // delete user from favorite list public function remove(Request $request) { $favorite_user_id = $request->get('user_id'); // شناسه کاربری که میخواهیم از لیست خود حذف کنیم Favorite::where('user_id',auth()->user()->id) ->where('favorite_user_id',$favorite_user_id) ->delete(); // return your response } ولی اگر بخواید به غیر از کاربران موارد دیگه ای رو هم به لیست دلخواه اضافه کنید اینطوری بهتر هست از روشهای دیگه ای مثل پیاده سازی با روابط polymorphic استفاده کنید. 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 ممنون مهندس بله من میخام فقط برای کاربران باشه این چیزی که قرار دادید رو گذاشتم یه ارور دارم SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'favorite_user_id' cannot be null شما از api استفاده کردید به این شکل نوشتید ؟من باید به یه شکل دیگه بنویسم تا این ارور نده ؟ نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 در 12 ساعت قبل، Paradox گفته است : ممنون مهندس بله من میخام فقط برای کاربران باشه این چیزی که قرار دادید رو گذاشتم یه ارور دارم SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'favorite_user_id' cannot be null شما از api استفاده کردید به این شکل نوشتید ؟من باید به یه شکل دیگه بنویسم تا این ارور نده ؟ خطا بخاطر این هست که favorite_user_id مقداری نفرستادید باید شناسه کاربری رو که میخواید توی لیست دلخواه قرار بگیره براش بفرستید. من با api اون مقدار رو با نام user_id براش ارسال کردم نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 در در ۱۴۰۱/۱۱/۱۰ در 12:15، saber گفته است : خطا بخاطر این هست که favorite_user_id مقداری نفرستادید باید شناسه کاربری رو که میخواید توی لیست دلخواه قرار بگیره براش بفرستید. من با api اون مقدار رو با نام user_id براش ارسال کردم چطوری باید ایدی کاربری که لایک کرد رو ثبت کنم ؟اصلا ایدی که به روت میدم پیدا نمیکنه نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 شما کدتون رو چطوری نوشتید؟ کدهایی که توی view نوشتید و route هایی که ساختید به همراه کدهایی که توی کنترلر نوشتید قرار بدید ببینیم مشکلتون کجا هست نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 جدول Schema::create('favorites', function (Blueprint $table) { $table->bigIncrements('id'); $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->foreignId('favorite_user_id')->constrained('users','id')->onDelete('cascade'); $table->timestamp('added_date')->default(DB::raw('CURRENT_TIMESTAMP')); }); مدل favorite public $timestamps = false; protected $fillable = [ 'user_id', 'favorite_user_id', 'added_date' ]; public function user() { return $this->belongsTo(User::class); } مدل user public function favorites() { return $this->hasMany(Favorite::class); } route Route::get('/profile/favorite/{favorite}' , [IndexController::class , 'favorite'])->name('favorite'); Route::get('/profile/unfavorite/{favorite}' , [IndexController::class , 'unFavorite'])->name('unFavorite'); blade <a href="{{ route('favorite' , $user->id ) }}"> <i class="fa fa-star text-black"></i> </a> <a href="{{ route('unFavorite' , $user->id ) }}" > <i class="fa fa-star text-warning"></i> </a> controller public function favorite($favorite) { // $favorite_user_id = Favorite::find($user); // dd($favorite_user_id); // Favorite::create([ // 'favorite' => 1 , // 'user_id' => $user->id, // 'favorite_user_id' => $favorite_user_id, // ]); $favorite_user_id = Favorite::find($favorite); Favorite::create([ 'user_id' => auth()->user()->id, 'favorite_user_id' => $favorite_user_id, 'added_date' => Carbon::now() ]); // dd($favorite); return back(); } public function unFavorite($favorite) { // $favorite = Favorite::where('user_id' , $favorite->id)->first(); // $favorite->delete(); $favorite_user_id = Favorite::find($favorite); Favorite::where('user_id',auth()->user()->id) ->where('favorite_user_id',$favorite_user_id) ->delete(); return back(); } الان مشکل اینه وقتی روی دکمه مورد علاقه میزنم ارور زیر دارم SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'favorite_user_id' cannot be null INSERT INTO `favorites` (`user_id`, `favorite_user_id`, `added_date`) VALUES (5, ?, 2023 -02 -01 14: 08: 35) نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 توی blade که آبجکت user رو دارید و شناسه کاربر رو توی route پاس میدید این آبجکت رو از کدوم کاربر ساختید؟ این آبجکت باید برای پروفایل کاربری باشه که دارید مشاهده میکنید مورد بعدی هم توی متدهای کنترلر که کد زیر رو نوشتید $favorite_user_id = Favorite::find($favorite); ورودی خود متد که $favorite هست شناسه همون کاربری هست که میخواید اضافه یا حذف کنید بدون نوشتن کد بالا میتونید مستقیم شناسه دریافتی رو به متد create یا delete پاس بدید ولی چون از متد get برای ساخت route استفاده کردید بهتر هست قبلش چک کنید چنین کاربری توی سایت موجود هست یا خیر اگر کاربر موجود بود ادامه کار رو انجام بدید در غیراینصورت یه پیغام خطا برگردونید که یه چیزی شبیه کد زیر میتونید بنویسید: $user = User::find($favorite); if(!$user) { // بازگشت با پیغام خطا } // اضافه شدن به لیست علاقه مندی Favorite::create([ 'user_id' => auth()->user()->id, 'favorite_user_id' => $favorite, 'added_date' => Carbon::now() ]); // حذف از لیست // اینجا قبل از حذف هم میتونید چک کنید که آیا چنین کاربری در لیست علاقه مندی از قبل هست یا خیر Favorite::where('user_id',auth()->user()->id) ->where('favorite_user_id',$favorite) ->delete(); 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 اینجا دارم کل کاربران رو نمایش میدم توی لیست بلید ، فورایچی که برای نمایش تمام کاربران سایت زدم برای این روت هم بر اساس ایدی کاربران گفتم لایک انجام بشه اشتباهه مگه ؟ یا من اشتباه متوجه شدم؟ <a href="{{ route('people.favorite' , $user->id ) }}"> <i class="fa fa-star text-black"></i> </a> الان تست گرفتم کار میکنه هم لایک هم انلایک ممنونم و اینکه روت get گذاشتم مشکلی که پیش نمیاد ؟بهتره از post استفاده کنم؟ و اینکه چطوری تو بلید میتونم شرط بزارم که اگه لایک شد ایکون انلایک نشون بده ؟ هر شرطی میزارم فقط یکیش نشون میده @if () <a href="{{ route('people.favorite' , $user->id ) }}"> <i class="fa fa-star text-black"></i> </a> @else <a href="{{ route('people.unFavorite' , $user->id ) }}" > <i class="fa fa-star text-warning"></i> </a> @endif نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 یه فیلد جدید اضافه کردم تو دیتابیس $table->boolean('favorite')->default(0); حالا شرط بر این اساس هم میخام بزارم نتونستم جواب بگیرم تو مدل favorite اضافه کردم public function isFavorite() { return $this->favorite ?? false; } شرط تو بلید @if (Auth::user()->isFavorite) یا این @if (Auth::user()->isFavorite == 1) نتونستم جواب بگیرم نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در بهمن 1 نیازی نیست فیلد جدید اضافه کنید اون رو حذفش کنید. برای اینکه چک کنید کاربر توی لیست مورد علاقه هست یا خیر اول باید لیست کاربران مورد علاقه یه نفر رو دریافت کنید بعد توی حلقه foreach که در blade کاربران رو نمایش میدید باید چک کنید شناسه کاربر جاری در لیست کاربران مورد علاقه هست یا خیر که یه کد مشابه زیر میتونید بنویسید // با این کد لیست شناسه کاربر مورد علاقه کاربری رو که لاگین کرده دریافت کنید و به بلید بفرستید $favorites = Favorite::where('user_id',auth()->user()->id)->pluck('favorite_user_id')->toArray(); // با کد زیر هم در حلقه ای که کاربران رو نمایش میدید چک کنید ببینید مورد علاقه هست یا خیر @foreach($users as $user) @if(in_array($user->id,$favorites)) // مورد علاقه هست @else // مورد علاقه نیست @endif @endforeach 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در بهمن 1 خیلی خیلی لطف کردید ممنونم نقل قول Share this post Link to post Share on other sites