رفتن به مطلب
انجمن پشتیبانی لاراول ایران

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

Recommended Posts

سلام وقت بخیر
من میخام کاربران مورد علاقه به سایت اضافه کنم باید از روش morph استفاده کرد درسته ؟
من هرچی سرچ زدم لایک و علاقه مندی برای پست و مقالات بود
من میخام برای کاربران باشه یعنی از بین کاربران اونایی که مورد علاقه هستند لایک و دیسلایک اضافه کنم
این لینک هایی که گذاشتم ایا مثل این انجام بدم و جدول post در نظر نگیرم میتونم به جواب برسم یا متفاوت هست ؟
لینک
و این لینک

Share this post


Link to post
Share on other sites

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

سلام
منطق کار یکی هست و مهم نیست برای پست و مقاله بوده باشه روش کار یکیه از همونها میتونید الگو برداری کنید حالا جایی باز مشکلی داشتید میتونید مشکل رو مطرح کنید

Share this post


Link to post
Share on other sites
در 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

به یه روش دیگه هم انجام دادم از طریق ایجکس ولی جواب نگرفتم 

 

کنترلر

  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

یه مشکلی که دارید داخل متد 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
در 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
در ۱ ساعت قبل، Paradox گفته است :

ممنون مهندس برای این روش که با ایجکس هست مشکل کارم کجاست؟

خطایی که گفتید در کنسول هست توی صفحه جیکوئری رو لود کردید؟ ممکنه بخاطر لود نشدن جیکوئری بهتون خطا داده باشه.
و اینکه الان توی متد ذخیره شما شناسه کاربری که پروفایلش مشاهده شده رو ذخیره نمیکنید و فقط شناسه کاربر لاگین شده رو ارسال میکنید

Share this post


Link to post
Share on other sites
در 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
در در ۱۴۰۱/۱۱/۱ در 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

یکم تغییر دادم جدول رو به این شکل نوشتم

  $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

این شکلی درسته ؟

برای ایدی خودم فقط حذف کار میکنه 

    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

من یه توضیح کلی براتون مینویسم بررسی کنید و از روی اون پیاده سازی کنید. اگه فقط برای 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 استفاده کنید.

Share this post


Link to post
Share on other sites

ممنون مهندس بله من میخام فقط برای کاربران باشه 

این چیزی که قرار دادید رو گذاشتم یه ارور دارم 

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'favorite_user_id' cannot be null

شما از api استفاده کردید به این شکل نوشتید ؟من باید به یه شکل دیگه بنویسم تا این ارور نده ؟

Share this post


Link to post
Share on other sites
در 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
در در ۱۴۰۱/۱۱/۱۰ در 12:15، saber گفته است :

خطا بخاطر این هست که favorite_user_id مقداری نفرستادید باید شناسه کاربری رو که میخواید توی لیست دلخواه قرار بگیره براش بفرستید. من با api اون مقدار رو با نام user_id براش ارسال کردم

چطوری باید ایدی کاربری که لایک کرد رو ثبت کنم ؟اصلا ایدی که به روت میدم پیدا نمیکنه 

Share this post


Link to post
Share on other sites

شما کدتون رو چطوری نوشتید؟ کدهایی که توی view نوشتید و route هایی که ساختید به همراه کدهایی که توی کنترلر نوشتید قرار بدید ببینیم مشکلتون کجا هست

Share this post


Link to post
Share on other sites

جدول

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

توی 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();

 

Share this post


Link to post
Share on other sites

اینجا دارم کل کاربران رو نمایش میدم توی لیست بلید ، فورایچی که برای نمایش تمام کاربران سایت زدم برای این روت هم بر اساس ایدی کاربران گفتم لایک انجام بشه

اشتباهه مگه ؟ یا من اشتباه متوجه شدم؟

<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

یه فیلد جدید اضافه کردم تو دیتابیس 

            $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

نیازی نیست فیلد جدید اضافه کنید اون رو حذفش کنید. برای اینکه چک کنید کاربر توی لیست مورد علاقه هست یا خیر اول باید لیست کاربران مورد علاقه یه نفر رو دریافت کنید

بعد توی حلقه 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

 

Share this post


Link to post
Share on other sites

وارد این گفتگو شوید

میتوانید پیام خود را ارسال کنید و بعد ثبت نام نمایید. در صورتی که حساب کاربری دارید, هم اکنون وارد شوید و در این گفتگو شرکت کنید.

مهمان
پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  Only 75 emoji are allowed.

×   لینک شما به صورت اتوماتیک جایگذاری شد.   نمایش به عنوان یک لینک به جای

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • جدید...