2017-08-11 23 views
1

我有3个表:如何在laravel 5.4中过滤我的数据?

  1. products
  2. productcolors
  3. productbrands

它们之间的关系是:

  1. 一个product有许多productcolors;
  2. productbrands属于product

所有products都标记为此依赖关系:cviebrock/eloquent-taggable

我已经使用这个渲染所有游泳标记的数据:

$allproducts = Product::withAllTags('swim')->get(); 

现在,我要为过滤与色彩和品牌的数据,但我不知道该怎么做。

这里是我的产品型号:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Cviebrock\EloquentTaggable\Taggable; 
use Carbon\Carbon; 

class Product extends Model 
{ 
    use Taggable; 

    protected $table ='products'; 

    protected $dates = ['published_at']; 

    public function setPublishedAtAttribute($date) { 
     $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date); 
    } 

    public function scopePublished($query) { 
     $query->where('published_at', '<=', Carbon::now()); 
    } 

    public function scopeUnpublished($query) { 
     $query->where('published_at', '>', Carbon::now()); 
    } 

    public function scopeNewin($query) { 
     $query->where('published_at', '>', Carbon::now()->subDays(7)); 
    } 

    public function getCreatedAtAttribute($date) { 
     return $this->asDateTime($date)->toFormattedDateString(); 
    } 

    public function getproductcolor() { 
     return $this->hasMany('App\productcolor'); 
    } 

    public function getproductimage() { 
     return $this->hasMany('App\productimage'); 
    } 

    public function getproductbrand() { 
     return $this->hasMany('App\productbrand'); 
    } 

    public function getproductsize() { 
     return $this->hasMany('App\size'); 
    } 
} 

这里是我的productcolor型号:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Cviebrock\EloquentTaggable\Taggable; 

class productcolor extends Model 
{ 
    use Taggable; 

    public function getproductcolor() { 
     return $this->belongsTo('App\Product'); 
    } 
} 

这里是我的productBrands型号:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Cviebrock\EloquentTaggable\Taggable; 

class productbrand extends Model 
{ 
    use Taggable; 

    public function productBrand() { 
     return $this->belongsTo('App\Product'); 
    } 
} 
+0

请出示代码为您模型,所以我们知道你的关系是如何定义的。 – Jerodev

回答

1

使用whereHasorWhereHas

$allproducts = Product::whereHas('productColors', function($query) { 
    $query->where('column', 'condition', 'value'); 
})->withAllTags('swim')->get(); 
+0

我发布了我的模特 –

+0

@SidHeart用您的关系名称getproductcolor替换'productColors'并更新where条件以符合您的过滤器要求。 – chanafdo

+0

您可以添加查看表格 –

0

试试这个:

$allproducts = Product::withAllTags('swim')->with(['getproductcolor' => function ($productColorQuery) { 
    $productColorQuery->where('blah', '=', 'blah'); 
}, 'getproductbrand' => function ($productBrandQuery) => { 
    $productBrandQuery->where('blah', '=', 'blah'); 
}])->get(); 
+0

可以告诉我我该如何写表格 –

0

使用whereHas()

Product::whereHas('colors', function ($q) use ($colorName) { 
     $q->where('name', $colorName); 
    }) 
    whereHas('brands', function ($q) use ($brandName) { 
     $q->where('name', $brandName); 
    }) 
    ->withAllTags('swim') 
    ->get(); 

不要忘记来定义产品模型中的关系:

public function colors() 
{ 
    return $this->hasMany(Color::class); 
} 

public function brands() 
{ 
    return $this->hasMany(Brand::class); 
} 
+0

可以添加视图吗?将发布或得到我从来没有这样做,所以我不知道谢谢请 –