سلام من میخام برای کاربران سایتم مثل ویژگی لایک و انلایک اضافه کنم که هر کاربر بتونه کاربران مختلف رو با لایک و جزء کاربران محبوب انتخاب کنه
مشکلی که دارم وقتی روی دکمه favorite کاربر مثلا ایدی 2 میزنم تو دیتابیس ثبت میشه ولی تو ظاهر بلید تغییری نمیکنه ولی وقتی روی دکمه 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->boolean('favorite')->default(0);
$table->timestamps();
});
روت
Route::get('/profile/favorite/{favorite}' , [IndexController::class , 'favorite'])->name('favorite');
Route::get('/profile/unfavorite/{favorite}' , [IndexController::class , 'unFavorite'])->name('unFavorite');
کنترلر
public function favorite(Request $request , User $favorite)
{
Favorite::create([
'favorite' => 1 ,
'user_id' => $favorite->id,
]);
return back();
}
public function unFavorite(User $favorite)
{
$favorite = Favorite::where('id' , $favorite->id)->where('user_id' , Auth::id())->first();
$favorite->delete();
return back();
}
مدل یوزر
اینجا این تابع که تو مدل 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;
}
}
مدل favorite
protected $fillable = [
'user_id', 'favorite'
];
public function user()
{
return $this->belongsTo(User::class);
}
بلید
@if ($user->is_favorite_by_auth_user())
<a href="{{ route('profile.unFavorite' , $user->id ) }}" data-toggle="tooltip" data-placement="top" >
<i class="fa fa-star text-warning"></i>
</a>
@else
<a href="{{ route('profile.favorite' , $user->id ) }}" data-toggle="tooltip" data-placement="top" >
<i class="fa fa-star text-black"></i>
</a>
@endif
لطفا راهنمایی کنید ممنون
با الکوئنت کار نکردم
ولی اگه بخوای میتونم برات بگم که چجور جدولا رو بسازی
شاید داری اشتباه میسازی؟
@alekasirabolfazl
چیزی که من میخام هر کاربر بتونه کاربران مختلفی رو به عنوان کاربران مورد علاقه انتخاب کنه
ای کاش فقط بخاطر گرفتن امتیاز پاسخ ثبت نکنید :)
ببین چندتا موضوع هستش
وقتی تو میخوای هر نفر بتونه نفر دیگه رو لایک یا دیسلاک کنه تو جدولی که ساختی برای لایک شدن رو باید اولا آی دی فردی که لایک میشه رو نگه داری و هم آی دی طرفی که لایک کرده
ینی میخوام بگم بهت یه جدول 3 ستونه داری که یه ستون شماره لایک کرده/یه ستون شماره لایک شده/یه ستون هم لایک که میشه مثلا عدد 1 و دیسلایک که میشه عدد-1
حالا چرا میگم هم لایک شده رو سیو کنی هم لایک کننده
برای اینکه هر نفر بتونه فقط یه بار یکی دیگه رو لایک یا دیسلاک کنه/نشه جوری که یه نفر بیاد و 100 بار یکی دیگه رو لایک کنه و هر دفعه هم امتیازش ثبت بشه
حالا اینکه طرف همون موقع که لایک میکنه آیکون لایک شده نمایش داده بشه و وقتی که لایکش رو برمیداره آیکون تغییر کنه تو باید برای اون دکمه لایک و دیسلاک ajax تعریف کنی یا اگر نمیخوای ajax بزنی صفحه برات رفرش میشه
@erfanwmb
سلام
به چه شکل ایدی فردی که لایک شده رو بگیرم
مثلا این شکلی ؟
$table->boolean('favorite')->default(0);
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('favorite_user_id')->constrained('users','id')->onDelete('cascade');
بله دقیقا میخام با ajax باشه
آموزشی هست که دقیقا به این شکل برای کاربران باشه؟
خودم هرچی سرچ زدم برای مقاله و پست و کامنت بوده و نتونستم به جواب برسم
آره
فقط میمونه روابط مدل ها که بنویسی برای دسترسی سریع تر و بهتر به کارت میاد شدیدااا
ببین کلیت ajax خیلی سخت و پیچیده نیست تو روی آیکونی یا المنت HTML که میخوای کاربر بعد از لایک استفاده کنه باید onclick بزاری به یه فانکشن js که داخل اون فاکشن با استفاده از دستور ajax مقادیر رو بفرستی توی کنترلر برای انجام عملیات بزار یه نمونه بهت نشون بدم
<a class="wishlist" id="wishlistButton{{$product->id}}" @auth onclick="addWishlistShop(event,'{{$product->id}}','{{$product->name}}','{{$product->price}}','{{str_replace('public','/storage',optional($product->gallery)->path)}}')" @endauth @guest onclick="snackBarFunction()" @endguest href="#wishlistButton">
مثلا من توی کد بالا داخل یه foreach آم برا نمایش یه بخشی از محصولاتم
من اومدم اینجا گفتم اگر کاربر لاگین باشه یه تابعی ساختم توی js و بهش event و ای دی محصول و اسمشو و سایر مشخصات محصول رو دادم به اون تابع در js .
function addWishlistShop(event, id,name,price,image) {
//
$.ajaxSetup({
headers : {
'X-CSRF-TOKEN' : document.head.querySelector('meta[name="csrf-token"]').content,
'Content-Type' : 'application/json'
}
})
//
$.ajax({
type : 'POST',
url : '/wishlist/add/',
data : JSON.stringify({
id : id ,
// cart : cartName,
_method : 'post'
}),
success : function(res) {
حالا تابع Js رو برات نوشتم که میگه این اطلاعاتی که گرفتم رو ببر مثلا به این url یا همون route خودمون و متدش پست هست و فلان و داخل اون route وصل میشه به کنترل من که اونجا میام و اطلاعاتم رو ذخیره میکنم و success آخر این تابع در js میگه اگر نتیجه با موفقیت انجام شد باید حالا بیام ایکون مثلا لایکم که سفید بوده رو قرمز کنم و این حرفا
@erfanwmb
من کدهامو میزارم میشه بررسی کنید تا اینجا درسته یا غلط؟
جدولم
Schema::create('favorites', function (Blueprint $table) {
$table->bigIncrements('id');
$table->boolean('favorite')->default(0);
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('favorite_user_id')->constrained('users','id')->onDelete('cascade');
$table->timestamps();
});
مدل یوزر
public function favorites()
{
return $this->hasMany(Favorite::class);
}
مدل favorite
protected $fillable = [
'favorite' , 'user_id', 'favorite_user_id'
];
public function user()
{
return $this->belongsTo(User::class);
}
بلید
< href="#" @auth onclick="addFavorite(event,'{{$user->id}}')" @endauth>
<i class="fa fa-star text-black"></i>
</a>
ایجکس
function addFavorite(event, id)
{
$.ajaxSetup({
headers : {
'X-CSRF-TOKEN' : document.head.querySelector('meta[name="csrf-token"]').content,
'Content-Type' : 'application/json'
}
})
//
$.ajax({
type : 'POST',
url : '/peoples/favorite/',
data : JSON.stringify({
id : id ,
_method : 'post'
}),
success : function(res) {
// چطوری بگم رنگشو تغییر بده
}
});
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟