مهرداد
4 سال پیش توسط مهرداد مطرح شد
26 پاسخ

فیلتر اطلاعات در لاراول

سلام دوستان من میخام اطلاعات مقالاتم رو فیلتر کنم توی url درخواستم بصورت get ارسال میشه و اطلاعات بر میگرده برام ولی فیلتر اعمال نمیشه ممنون میشم راهنماییم کنید توی عکس url هم مشخصه
توضیح تصویر رو وارد کنید

    public function scopeFilter($query)
    {
        $category = request('category');
        if(isset($category) && trim($category) != '' && $category != 'all'){
            $query->whereHas('categories' , function($query) use($category){
                $query->whereId($category);
            });
        }

        if(request('order') == 1){
            $query->oldest();
        }else{
            $query->latest();
        }

        return $query;
    }
        <form action="/">
                <div class="form-filter">
                    <select name="category" id="">
                        <option value="all">همه دسته ها</option>
                        @foreach (\App\Category::all() as $category)
                            <option value="{{$category->id}}" {{request('category') == $category->id ? 'selected' : ''}}>{{$category->name}}</option>
                        @endforeach
                    </select>

                    <select name="order" id="">
                        <option value="all">همه مقالات ها</option>
                        <option value="0" {{request('order')=='0' ? 'selected' :''}}> تازه ترین ها</option>
                        <option value="1" {{request('order')=='1' ? 'selected' :''}}> قدیمی ترین ها</option>
                    </select>

                    <button type="submit" class="buttonf">فیلتر</button>
                </div>
        </form>

ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

من از روش ساده تری استفاده می کنم با این روش شما کار نکردم. یه اشتباه هم که در کدهای جنابعلی هست اینه که شما دسته هارو داخل ویو خوندی در حالی که باید از طریق کنترلر این کار انجام بشه.
بعد اینکه خط اول و دوم داخل متد فیلتر شما باید عوض بشه یعنی ابتدا برسی بشه داخل ریکوءست فیلد دسته بندی وجود داره اگه اره اون وقت مقدارشو در متغییر دسته بندی میریزیم و شرط trim هم میتونه برداشته شه .


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

ضمنا شما در فانکشنی که در داخل فانکشن اصلی اوردین چرا از دستور return استفاده نکردین؟


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش مطرح شد
0

@mehrdadroshanraee69
سلام.
با استفاده از PipeLine ها پیاده سازی کنید. لینک زیر به صورت عملی به شما آموزش میده:
https://bit.ly/3ekqHKQ


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

ضمنا شما متغیر $query رو بعد اعمال شرط مجدد در داخل این متغییر بریزین.


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

@hosseinshirinegad98
والا ریترن کردم که در اخر return $query کردم منظورتون از خط اول و دوم کجاس؟ و اینکه روش خودتون رو میشه بذارید؟


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

@mohsenbostan
آقای بستان بنظر شما این روش PipeLine یه مقدار قضیه رو پیچیده تر نمیکنه؟


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

اینارو تست کن نتیجه رو بهم بگو

    public function scopeFilter($query)
    {
        $data = request()->all();
        if ( isset( $data['category'] ) && $data['category'] != 'all') {
            $query->whereHas('categories' , function($query) use( $data['category'] ) {
                // منظورم این خط بود
                return $query->whereId( $data['category'] ); 
            });
        }

        if ( request('order') == 1 ) {
            $query->oldest();
        } else {
            $query->latest();
        }

        return $query;
    }

@mehrdadroshanraee69


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

@hosseinshirinegad98
آقای شیری متاسفانه کد شما هم جواب نداد


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

در انتهای متدهای latest , oldest متد get قرار بدین تست کنید.@mehrdadroshanraee69


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0
if ( request('order') == 1 ) {
            $query->oldest()->get();
        } else {
            $query->latest()->get();
        }

مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

@hosseinshirinegad98
والا انجام دادم نشد که نشد نمیدونم بخدا علت از چیه والا یه فیلتر کردن اینقدر دنگ و فنگ نداره


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش آپدیت شد
0

شما متد scopeFilter رو کجا فراخوانی میکنید اون تابعشو کامل برام بفرستین؟
بعدش چه لزومی داره از whereHas استفاده کنید. اگه ضروری نیست برش دارین.
دستور return رو که گفتم اضافه کردینو پاکش کنین.
و یک سوال از رابطه Polymorphic استفاده کردین؟
@mehrdadroshanraee69


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش مطرح شد
0

@mehrdadroshanraee69
ببینید Pipe Line نه تنها پیچیده نمی‌کنه، بلکه باعث میشه پروژه ساختار بهتری پیدا کنه.
همچنین قابلیت reusability رو بهتون میده که برای چند مدل استفاده کنید.
این روش بهترین روش برای فیلتر کردن هستش.


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

ببینید scope رو داخل مدل آرتیکل نوشتم این کل دل هستش
@hosseinshirinegad98

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Cviebrock\EloquentSluggable\Sluggable;

class Article extends Model
{
    use Sluggable;

    protected $fillable = [
        'title' ,'customslug' , 'body' , 'tags' , 'images' , 'user_id'
    ];

    protected $casts =[
        'images' => 'array'
    ];

        /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'customslug'
            ]
        ];
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function path()
    {
        return "/article/$this->slug";
    }

    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }

    public function comments()
    {
        return $this->morphMany(Comment::class ,'commentable');
    }

    public function scopeFilter($query)
    {
        $category = request('categories');
        if(isset($category) && trim($category) != '' && $category != 'all'){
            $query->whereHas('categories' , function($query) use($category){
                $query->whereId($category);
            });

        }

        if(request('order') == 1){
            $query->oldest();
        }else{
            $query->latest();
        }

        return $query;
    }
}

حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش آپدیت شد
0

1 - برنامه رو وقتی اجرا میکنی آیا اروری هم بهت نشون میده؟ اگه آره. برام بفرستش.
2- البته من از شما اون متدی که داخل کنترلر هست و متد scopeFilter اونجا صدا زده شده رو خواسته بودم که برام بفرستین نه مدل Article رو.
مواردی که گفته بودمو به دقت برسی و انجام بدین.@mehrdadroshanraee69


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

@hosseinshirinegad98
هیچ اروری توی برنامه ندارم میشه ایدی تلگرامتون رو بهم بدید که اونجا بیشتر ازتون کمک بگیرم؟


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
0

@mohsenbostan
اقای بستان طبق روش شما هم پیش رفتم بازم اوکی نشد اصلا انگار هیچی کوئری ارسال نمیشه به ویو برام ببخشید زیاد سوال میپرسم چون تازه کارم ابهامه برام
توضیح تصویر رو وارد کنید

توضیح تصویر رو وارد کنید

توضیح تصویر رو وارد کنید


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

سلام چون از روابط چند به چند استفاده کردین یه خورده کده پیچیده تری داره. کم یه قطعه کد به شما میدم.@mehrdadroshanraee69


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

کدها تست شدست و صحت عملکردش برسی شده.

    // تمام کدهایی رو که شما نوشتین کامنت کنید و برای صفحه مقاله ها و فیلتر از این کدها
    // استفاده کنید
    // در اکشن کنترلر مربوطه این کدهارو داخل یک متد با هر نامی که مایل بودید قرار بدین
    // برای نمونه اون روت شما رو که من دیدم اینجا براتون دوباره روت و کنترلرشو مینویسم با اسم مت.
    // ÷س روتی ایجاد کنید به صورت زیر
    //Route::('/', 'HomeController@index');
    // و این متدودو داخلش ک÷ی کنید.
    // در واقع این متد دو کار انجام میده وقتی که صفحه برای اولین بار برای مقاله ها لود میشه
    // قسمت دوم متد ایندکس اجرا میشه اگه هم فیلتر کنه که قسمت اولش با توجه به شروط اجرا میگردد.
    public function index() 
    {
        $request = request();
        if ( isset( $request['category'] ) && isset( $request['order'] ) ) {
            if ( $request['category'] == 'all' ) {
                $articles = Article::get();
            } else {
                $category = Category::find( $request['category'] );
                $array_article_ids = \DB::table('article_category')
                                        ->where('category_id', $request['category'])
                                        ->pluck('article_id')
                                        ->toArray();
                // مقدار 0 برای صعودی
                // مقدار 1 برای نزولی
                // مقدار all لازم نیست
                if ( $request['order'] == 0 ) {     
                    $articles = Article::whereIn('id', $array_article_ids)->oldest()
                                    ->get(); 
                } elseif ( $request['order'] == 1 ) {
                    $articles = Article::whereIn('id', $array_article_ids)->latest()
                                    ->get(); 
                }
            }

        } else { // قسمت دوم
            $articles = Article::latest()
                            ->get();
        }

        return $articles;

        // چون از رابطه منی تو منی استفاده کردی جداولت باید به این صورت باشن
        //آشنایی دارین که
        // جدول دسته ها با نام categories
        // جدول مقاله ها با نام articles
        //یک جدول میانه حتما با نام article_category
        // بعد روابط چند به چند این دو جدول رو در مدلها ایجاد کنید
    }

@mehrdadroshanraee69


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

توضیح تصویر رو وارد کنید
عکس تست شده برنامه


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

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