Armin Rahmati
2 سال پیش توسط Armin Rahmati مطرح شد
3 پاسخ

جستجو در لاراول

سلام دوستان.
من به دلایلی اطلاعات کاربر رو داخل یه جدول جدا به اسم profiles ذخیره کردم.
من سه تا جدول دارم:
جدول users

Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('role')->default('user');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamps();
        });

جدول profiles

Schema::create('profiles', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onUpdate('CASCADE')->onDelete('CASCADE');
            $table->string('fullName');
            $table->string('phone');
            $table->timestamps();
        });

جدول jobs

Schema::create('jobs', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onUpdate('CASCADE')->onDelete('CASCADE');
            $table->string('slug');
            $table->string('title');
            $table->string('category_name');
            $table->string('history');
            $table->string('state');
            $table->string('city');
            $table->longText('description');
            $table->boolean('approved')->default(0);
            $table->timestamps();
        });

حالا زمانی که میخوام بین شغل های تایید شده جستجو رو بر اساس عنوان شغل که داخل جدول jobs و اسم کاربر که داخل جدول profiles است انجام بدم به ارور زیر بر میخورم:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'jobs.profile_id' in 'where clause' (SQL: select count(*) as aggregate from `jobs` where `title` LIKE %آرمین رحمتی% or exists (select * from `profiles` where `jobs`.`profile_id` = `profiles`.`id` and `fullName` LIKE %آرمین رحمتی% and `approved` = 2) and `approved` = 2)

کدی که نوشتم هم به صورت زیر هست.

public function approved() {
        $jobs = Job::query()
            ->when($keyword = request('search'), function ($query) use ($keyword) {
                $query->where('title', 'LIKE', "%{$keyword}%")
                ->orWhereHas('profile', function ($query) use ($keyword) {
                $query->where('fullName', 'LIKE', "%{$keyword}%")
                ->where('approved', 2);
            });
        });
        $jobs = $jobs->where('approved', 2)->latest()->paginate(10);
        return view('panel.jobs.approved', compact('jobs'));
    }

ثبت پرسش جدید
فخرالدین لنگی
تخصص : برنامه نویس وب، آندروید و سیست...
@fakhraddin 2 سال پیش مطرح شد
0

با سلام و وقت بخیر دوست گرامی
همونطور که پیغام ارورتون می گه ستون profile_id در جدول jobs وجود نداره
شما برای رفع این مشکلتون می تونید
1.یک ریلشن بنویسید و کالکشنتون رو فیلتر کنید که این روش کندتریه

  1. اینکه یک جوین انجام بدید با همون دستورات Elequent بین جدول profile و jobs

Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@fakhraddin
الان کدمو به صورت زیر نوشتم ولی هچنان همون ارور رو میده.

public function approved() {
        $jobs = Job::query()
        ->join('profiles', 'jobs.id', '=', 'profiles.user_id')
            ->when($keyword = request('search'), function ($query) use ($keyword) {
                $query->where('title', 'LIKE', "%{$keyword}%")
                ->orWhereHas('profile', function ($query) use ($keyword) {
                $query->where('fullName', 'LIKE', "%{$keyword}%")
                ->where('approved', 2);
            });
        });
        $jobs = $jobs->where('approved', 2)->latest()->paginate(10);
        return view('panel.jobs.approved', compact('jobs'));
}

فخرالدین لنگی
تخصص : برنامه نویس وب، آندروید و سیست...
@fakhraddin 2 سال پیش مطرح شد
0

با سلام و وقت بخیر
من چندتا نکته در مورد کوئری که زدید بدم و بعد براتون یک کوئری با منطق بهتر خدمتتون ارائه می دم

  1. هیچ ستون ارتباطی مستقیم به جدول jobs و profiles وجود نداره بلکه هر دوی این جداول مستقیم به جدول users مرتبطن و شما به جای اینکه شناسه jobs رو به ستون user_id جدول profiles جوین کنید باید شناسه user_id در دو جدول مربوطه رو بهم متصل کنید
  2. مقدار approved یک مقدار بولین یعنی از لحاظ منطقی یا صفره یا یک غیر این دو مقدار کلا منطق برنامه شما رو دچار مشکل می کنه
  3. وقتی دو جدول رو باهم جوین می کنید سعی کنید قبل اسم ستون اسم جدول رو بیارید که اگه زمانی دوتا ستون مشابه بودن برای کوئریتون اروری پیش نیاد این فقط توصیه است
  4. ستون approved یک بار توی کوئری داخلی سرچ می شه یک بار هم توی خط بعدش که اینم از لحاظ منطقی جواب درستی نیست
    5.این که دقیقا چک کنید فیلد هایی که توی مایگریشن وجود داره عینا توی جدول دیتابیس هم به اون شکل و اسپل باشه
  5. در کلاس مدل اگه از fillable استفاده می کنید که شدیدا هم خودم توصیه میکنم استفاده کنید عینا اسم تک تک ستون های جداول رو چک بفرمایید و اگرم از guard استفاده می کنید که نیازی نیست
    اما کدی که من به نظرم بهتر از کد شماست و موارد بالا توش رعایت شده به شکل زیر تا حط ممکن کد رو شفاف نوشتم و تکنیک خاصی به کار نبردم و توی کوئری خودم برای مثال سه تا ستون خروجی گرفتم شناسه و عنوان jobs و اسم یوزر در profiles
    $jobs = Job::leftJoin('profiles', function($join) {
            $join->on('jobs.user_id', '=', 'profiles.user_id');
          })->where('jobs.approved', 1)->whereRaw('jobs.title LIKE ?', '%'.$keyword.'%')->
        whereRaw('profiles.fullName LIKE ?', '%'.$keyword.'%')->latest->
        get(['jobs.id', 'jobs.title', 'profiles.fullName']);

امیدوارم توضیحاتم هر چند طولانیه کمک کنه به شما و اگه بازم نیاز به راهنمایی داشتید خوشحال می شم کمکی بکنم


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

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