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

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

Recommended Posts

سلام وقت بخیر من میخام جستجو بر اساس فیلتر ایجاد کنم
برای دو جدول کابران و جدول شهر ( که اینجا از روش چند به چند استفاده کردم و تو جدول منطقه user_id قرار داره اینجا مشکلی برای جستجو وجود نداره؟)
برای جدول کاربران فیلدهایی که میخام فیلتر بشه از enum استفاده کردم (3 تا مقدار اول enum هستن )  اینجا به چه شکل باید تعریف کنم؟ تو این حالت فقط تو url نمایش میده و کاربر رو پیدا نمیکنه

       $user_query = User::query();
         $city_query = City::query();
 
         if($keyword = $request->get('search')){
 
             $user_query->where('age_difference' , '=' , "{$keyword}")->where('time' , '=' , "{$keyword}")->where('disability' , '=' , "{$keyword}")->orWhereHas('cities' , function ($query) use ($keyword){
                 $query->where('name', 'like', "%{$keyword}%")->get();
             });
 
         } 

 

Share this post


Link to post
Share on other sites

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

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

Call to undefined method App\Models\User::cities()

چطوری توی روابط چند به چند میتونم این مشکل رو حل کنم ؟

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

Share this post


Link to post
Share on other sites
در 13 ساعت قبل، saber گفته است :

منظورتون این هست که خود جدول شهرها با کاربران از طریق جدول مناطق ارتباط داره؟ و جدول شهر مستقیم ارتباطی به user نداره درسته؟

بله دقیقا منظورم همینه

Share this post


Link to post
Share on other sites

به این شکل که نوشتم وقتی dd میگیرم کل مشخصات کاربری که فیلتر کردم میاره ولی در حالت عادی هیچ کاربری رو نمایش نمیده 

 $users = User::where('status', true);

        if ($request->has('age_difference')) {
            $users->where('age_difference', '=', $request->age_difference);
        }

        if ($request->has('time')) {
            $users->where('time', '=' , $request->time);
        }

        if ($request->has('disability')) {
            $users->where('disability', '=' , $request->disability);
        }

        if ($request->has('name')) {
            $users->where(function ($query) use ($request) {
                $query->whereHas('cities', function ($query) use ($request) {
                    $query->where('name', 'like', $request->name);
                });
            });
        }
        // dd($users->get());

 

Share this post


Link to post
Share on other sites

باید روابط بین جداول رو اول ایجاد کنید بعد توی کوئریها ازشون استفاده کنید کلا روشهای مختلفی میشه به نتایج رسید ولی با روابط اول باید بین شهر و منطقه و کاربران روابطی رو که دارن ایجاد کنید مثلا به شکل زیر

// User model
  public function region() : BelongsTo
    {
        return $this->belongsTo(Region::class);
    }
===========================	
	// City model
	  public function regions() : HasMany
    {
        return $this->hasMany(Region::class);
    }
============================
	// Region model
	    public function users() : HasMany
    {
        return $this->hasMany(User::class);
    }

    public function city() : BelongsTo
    {
        return $this->belongsTo(City::class);
    }
========================
	// توی کنترلر به شکل زیر
	 $users = User::where('status', true);

        if ($request->has('age_difference')) {
            $users->where('age_difference', '=', $request->age_difference);
        }

        if ($request->has('time')) {
            $users->where('time', '=' , $request->time);
        }

        if ($request->has('disability')) {
            $users->where('disability', '=' , $request->disability);
        }

        if ($request->has('name')) {
            $users->where(function ($query) use ($request) {
                $query->whereHas('region', function ($query) use ($request) {
				$query->whereHas('city', function ($query) use ($request) {
				$query->where('name', 'like', $request->name);
                });
            });
                });
            });
        }
        dd($users->get());

 

Share this post


Link to post
Share on other sites

ممنونم مهندس بازهم تو dd درست نمایش میده ولی وقتی تو compact میزارم کل کاربران سایت رو نمایش میده

این تگ فرم و دکمه من مشکلی نداره ؟ 

                                <form class="row g-3" action="{{ route('search') }}">
                                   
                                    <div class="col-12 text-center mt-5 mb-4">
                                      <button class="btn btn-orange">جستجو</button>
                                    </div>

                                  </form>
       

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
در 23 دقیقه قبل، saber گفته است :

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

چرا دقیقا داخل فرم قرارشون دادم همه رو 

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

    public function region()
    {
        // return $this->belongsTo(Region::class);
        return $this->belongsToMany(Region::class);
    }

وقتی belongsTo میزارم ارور میده 

Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsTo::sync()

که من 

belongsToMany

گذاشته بودم کار میکنه

دونه به دونه dd میگیرم بعد هر  شرط باز هم نمایش میده کاربر مورد نظرو

ولی وقتی compact میگیرم کل کاربران نمایش میده ! هوف

 

Share this post


Link to post
Share on other sites
در 6 ساعت قبل، saber گفته است :

بین شهر و منطقه رابطه چند به چند دارید؟ و بین منطقه و کاربران رابطه یک به چند؟

در کل برای پروژم من میخام هر کاربر بتونه بعدا استان و شهر و منطقه خودش رو تغییر بده 

و هر کاربر بتونه یک یا چند منطقه رو انتخاب کنه 

این روابط اشتباهه؟

 

مدل user

    public function region()
    {
        return $this->belongsTo(Region::class);
        // return $this->belongsToMany(Region::class);
    }

مدل استان

  public function cities()
    {
        return $this->hasMany(City::class);
    }

مدل شهر

    public function provinces()
    {
        return $this->belongsToMany(Province::class);
    }
    
    public function regions()
    {
        return $this->hasMany(Region::class);
    }

مدل منطقه

    public function city()
    {
        return $this->belongsTo(City::class);
    }

    public function users()
    {
        return $this->hasMany(User::class);
        // return $this->belongsToMany(User::class);
    }

 

Share this post


Link to post
Share on other sites

یه سوال ایا نیازه جدول جدا برای فیلتر ایجاد بشه ؟

من میخام فیلترهایی که برای کاربران قابل نمایش هست از پنل ادمین بشه مدیریتش کنه ( مثلا بتونم سن رو غیرفعال کنم تا فیلتر بر اساس موارد دیگه باشه و سن رو نشون نده موقع فیلتر کردن)

 

Share this post


Link to post
Share on other sites
در در ۱۴۰۱/۱۱/۲۵ در 13:37، Paradox گفته است :

یه سوال ایا نیازه جدول جدا برای فیلتر ایجاد بشه ؟

من میخام فیلترهایی که برای کاربران قابل نمایش هست از پنل ادمین بشه مدیریتش کنه ( مثلا بتونم سن رو غیرفعال کنم تا فیلتر بر اساس موارد دیگه باشه و سن رو نشون نده موقع فیلتر کردن)

 

برای این موضوع میتونید یه بخش تنظیمات توی پنل ادمین داشته باشید و بخشهایی رو که میخواید قابل فیلتر باشن از اونجا مشخص کنید و هر زمانی خواستید یه بخشی رو فعال یا غیرفعال کنید

Share this post


Link to post
Share on other sites
در در ۱۴۰۱/۱۱/۲۶ در 00:17، Paradox گفته است :

 موقع dd به بخش رو false میاره


Illuminate\Database\Eloquent\Collection {#1528 ▼ // app\Http\Controllers\frontend\SearchController.php:62
  #items: array:1 [▶]
  #escapeWhenCastingToString: false  این بخش فالس هست
}

 

این بخش وقتی dd میگیرم اطلاعات همون کاربری که میخام نمایش میده ولی یه ارور هم دارم دلیلش چیه ؟

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.


×
×
  • جدید...