راکت
مهرداد
مهرداد
توسط مهرداد مطرح شد
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
@hosseinshirinegad986 سال پیشمطرح شد
0

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


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

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


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

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


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

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


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

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


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

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


حسین شیری نژاد
حسین شیری نژاد
تخصص :programmer
@hosseinshirinegad986 سال پیشمطرح شد
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


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

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


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

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


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

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

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


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

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


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

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


مهرداد
مهرداد
@mehrdadroshanraee696 سال پیشمطرح شد
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
@hosseinshirinegad986 سال پیشمطرح شد
0

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


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

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


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

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


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

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


حسین شیری نژاد
حسین شیری نژاد
تخصص :programmer
@hosseinshirinegad986 سال پیشمطرح شد
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
@hosseinshirinegad986 سال پیشمطرح شد
0


عکس تست شده برنامه


صفحه 1 از 2

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

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