Как получить только активный элемент от многих ко многим отношениям с переводом в laravel - PullRequest
0 голосов
/ 15 мая 2018

У меня проблема со связями «многие ко многим» и переводами терминов. У меня есть 4 таблицы:

products
    - id, price, whatever
products_lang
    - id, product_id, lang, product_name
accessori
    - id, active
accessori_lang
    - id, accessori_id, lang, accessori_name

Я пытаюсь присвоить аксессуары продуктам с промежуточной таблицей с именем:

accessori_products

это модель для продукта:

class Product extends Model {

    protected $table = 'products';

    public function productsLang () {
        return $this->hasMany('App\ProductLng', 'products_id')->where('lang','=',App::getLocale());
    }

    public function productsLangAll() {
        return $this->hasMany('App\ProductLng', 'products_id');
    }

    public function accessori() {
        return $this->belongsToMany('App\Accessori', 'accessori_products');
    }
}

это модель для productLng:

class ProductLng extends Model {

    protected $table = 'products_lng';

    public function products() {
        return $this->belongsTo('App\Product', 'products_id', 'id');
    }
}

Тогда у меня есть модель для Accessori:

class Accessori extends Model {

    protected $table = 'accessori';

    public function accessoriLang() {
        return $this->hasMany('App\AccessoriLng')->where('lang','=',App::getLocale());
    }

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

    public function accessoriProducts() {
        return $this->belongsToMany('App\Products', 'accessori_products', 'accessori_id', 'products_id');
    }
}

И модель для AccessoriLng:

class accessoriLng extends Model {

    protected $table = 'accessori_lng';

    public function accessori() {
        return $this->belongsTo('App\Accessori', 'accessori_id', 'id');
    }
}

Я получаю результаты по этому:

$products = Product::has('accessori')->with([
  'productsLang ',
  'accessori' => function ($accessori){
      $accessori->with([
        'accessoriLang'
      ]);
   }
])->get();

return $products;

но я хочу получить только активные аксессуары, например where accessori.active = 1, но я действительно не знаю, где их поставить. Я пытался по-другому, но я застрял на 2 дня.

1 Ответ

0 голосов
/ 15 мая 2018

IIRC вам не нужна модель для промежуточной таблицы ваших отношений "многие ко многим".

Если вы хотите вернуть Продукты с активным Accessori, вы можете использовать whereHas для модели Продукта.

$prod = Product::whereHas('accessori', function($query) {
  $query->where('active', 1);
})->get();

Где параметр $query будет работать на модели Accessori.

Вы также можете сделать обратное с Accessori to Product.

$acessoris = Accessori::where('active', 1)->whereHas('accessoriProduct')->with(['accessoriLang', 'accessoriProducts.productsLang'])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...