2015-05-05 2 views
1

Я пытаюсь познакомиться с красноречивым, и я играл с некоторыми глобальными областями запросов, но у меня нет большого успеха, когда дело доходит до того, что он о взаимоотношениях.Глобальный охват запросов и отношения с Laravel 5

У меня есть две модели; продукт и категория, каждая из которых добавляет некоторые глобальные области запросов.

продукты:

use productConditions; 

protected $table = 'product'; 
public $timestamps = false; 

private $websiteDetails; 

public function __construct(){ 
    parent::__construct(); 
    $this->websiteDetails = session('website'); 
} 

public function scopeByCategory($query, $categoryId){ 
    return $query->whereHas('categories', function($q) use ($categoryId){ 
     $q->where('id', $categoryId); 
    }); 
} 

public function categories(){ 
    return $this->belongsToMany('App\Category', 'product_category', 'product_id', 'category_id'); 
} 

Категория:

use categoryConditions; 

protected $table = 'category'; 
public $timestamps = false; 

public function products() { 
    return $this->belongsToMany('App\Product', 'product_category', 'category_id', 'product_id'); 
} 

Я использую черты для загрузки глобальных областей и файлы следующим образом:

Так что для продуктов:

public function apply(Builder $builder, Model $model) 
{ 
    $builder->where('state', 'a'); 
    $builder->where('stock_level', '>', 0); 
} 

public function remove(Builder $builder, Model $model){ 

    $query = $builder->getQuery(); 

    foreach((array) $query->wheres as $key => $where){ 

     if($where['column'] == 'state'){ 
      unset($query->wheres[$key]); 
     } 

     if($where['column'] == 'stock_level'){ 
      unset($query->wheres[$key]); 
     } 

    } 
    $query->wheres = array_values($query->wheres); 
} 

и для категорий

public function apply(Builder $builder, Model $model) 
{ 
    $websiteDetails = session('website'); 
    $builder->where('website_id', $websiteDetails['id']); 
} 

public function remove(Builder $builder, Model $model){ 

    $query = $builder->getQuery(); 

    foreach((array) $query->wheres as $key => $where){ 

     if($where['column'] == 'website_id'){ 
      unset($query->wheres[$key]); 
     } 
    } 
    $query->wheres = array_values($query->wheres); 
} 

Поскольку существует несколько записей для поля категории с определенным идентификатором, из-за лицом, что есть несколько профилей веб-сайтов. Я хотел установить глобальную область запроса для категорий -> site_id.

Так что это прекрасно работает, делая некоторые, как это:

$category = Category::with('products')->first(); 
$category->products; 

Он получает все категории с указанным website_id, а затем тянет в продуктах.

Однако, когда я настраивал область запроса в модели, это не сработало, чтобы сделать практически то же самое, но наоборот. Таким образом, это не работает:

$category = Product::byCategory(2)->get(); 

Если я не удалить глобальный масштаб запросов в категории модели и модификации закрытия whereHas для:

public function scopeByCategory($query, $categoryId){ 
    return $query->whereHas('categories', function($q) use ($categoryId){ 
     $q->where('id', $categoryId)->where('website_id', $this->websiteDetails['id']); 
    }); 
} 

, но делает это так, значит, я могу больше не запрашивает модель категории, не настраивая какой-либо метод области запроса веб-сайта.

Может кто-нибудь сказать мне, если я как-то ошибаюсь или предлагаю другое решение моей проблемы.

Большое спасибо

ответ

0

Попробуйте перезаписать метод запроса в категории модели, она должна работать для категорий.

public function newQuery($excludeDeleted = true) { $websiteDetails = session('website'); return parent::newQuery()->where('website_id', $websiteDetails['id']); }

Если он не работает, как отношение продукта попробовать это:

public function categories(){ return $this->belongsToMany('App\Category', 'product_category', 'product_id', 'category_id') ->where('website_id', $this->websiteDetails['id']); }); }

Смежные вопросы