سلام دوستان من میخام اطلاعات مقالاتم رو فیلتر کنم توی 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>
من از روش ساده تری استفاده می کنم با این روش شما کار نکردم. یه اشتباه هم که در کدهای جنابعلی هست اینه که شما دسته هارو داخل ویو خوندی در حالی که باید از طریق کنترلر این کار انجام بشه.
بعد اینکه خط اول و دوم داخل متد فیلتر شما باید عوض بشه یعنی ابتدا برسی بشه داخل ریکوءست فیلد دسته بندی وجود داره اگه اره اون وقت مقدارشو در متغییر دسته بندی میریزیم و شرط trim هم میتونه برداشته شه .
@mehrdadroshanraee69
سلام.
با استفاده از PipeLine ها پیاده سازی کنید. لینک زیر به صورت عملی به شما آموزش میده:
https://bit.ly/3ekqHKQ
@hosseinshirinegad98
والا ریترن کردم که در اخر return $query کردم منظورتون از خط اول و دوم کجاس؟ و اینکه روش خودتون رو میشه بذارید؟
اینارو تست کن نتیجه رو بهم بگو
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;
}
if ( request('order') == 1 ) {
$query->oldest()->get();
} else {
$query->latest()->get();
}
@hosseinshirinegad98
والا انجام دادم نشد که نشد نمیدونم بخدا علت از چیه والا یه فیلتر کردن اینقدر دنگ و فنگ نداره
شما متد scopeFilter رو کجا فراخوانی میکنید اون تابعشو کامل برام بفرستین؟
بعدش چه لزومی داره از whereHas استفاده کنید. اگه ضروری نیست برش دارین.
دستور return رو که گفتم اضافه کردینو پاکش کنین.
و یک سوال از رابطه Polymorphic استفاده کردین؟
@mehrdadroshanraee69
@mehrdadroshanraee69
ببینید Pipe Line نه تنها پیچیده نمیکنه، بلکه باعث میشه پروژه ساختار بهتری پیدا کنه.
همچنین قابلیت reusability رو بهتون میده که برای چند مدل استفاده کنید.
این روش بهترین روش برای فیلتر کردن هستش.
ببینید 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;
}
}
1 - برنامه رو وقتی اجرا میکنی آیا اروری هم بهت نشون میده؟ اگه آره. برام بفرستش.
2- البته من از شما اون متدی که داخل کنترلر هست و متد scopeFilter اونجا صدا زده شده رو خواسته بودم که برام بفرستین نه مدل Article رو.
مواردی که گفته بودمو به دقت برسی و انجام بدین.@mehrdadroshanraee69
@hosseinshirinegad98
هیچ اروری توی برنامه ندارم میشه ایدی تلگرامتون رو بهم بدید که اونجا بیشتر ازتون کمک بگیرم؟
@mohsenbostan
اقای بستان طبق روش شما هم پیش رفتم بازم اوکی نشد اصلا انگار هیچی کوئری ارسال نمیشه به ویو برام ببخشید زیاد سوال میپرسم چون تازه کارم ابهامه برام
سلام چون از روابط چند به چند استفاده کردین یه خورده کده پیچیده تری داره. کم یه قطعه کد به شما میدم.@mehrdadroshanraee69
کدها تست شدست و صحت عملکردش برسی شده.
// تمام کدهایی رو که شما نوشتین کامنت کنید و برای صفحه مقاله ها و فیلتر از این کدها
// استفاده کنید
// در اکشن کنترلر مربوطه این کدهارو داخل یک متد با هر نامی که مایل بودید قرار بدین
// برای نمونه اون روت شما رو که من دیدم اینجا براتون دوباره روت و کنترلرشو مینویسم با اسم مت.
// ÷س روتی ایجاد کنید به صورت زیر
//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
// بعد روابط چند به چند این دو جدول رو در مدلها ایجاد کنید
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟