如何从laravel中的多个与多个关系中获取活动元素

I have a problem with a many to many relationship and the translations of the terms. I have 4 tables:

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

I'm trying to assign accessories to products with an intermediate table named:

accessori_products

this is the model for Product:

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');
    }
}

this is the model for productLng:

class ProductLng extends Model {

    protected $table = 'products_lng';

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

Then I have the model for 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');
    }
}

And the model for AccessoriLng:

class accessoriLng extends Model {

    protected $table = 'accessori_lng';

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

I get the results by this:

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

return $products;

but I want to get only the active accessories something like where accessori.active = 1 but I really don't know where to put it. I've tried in different way but I'm stuck on it by 2 days.

IIRC you don't need a model for the intermediate table on your many to many relationships.

If you want to return Products where Accessori is active you can use whereHas on the Product model.

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

Where the $query param will be running on the Accessori model.

You can do the inverse as well with Accessori to Product.

$acessoris = Accessori::where('active', 1)->whereHas('accessoriProduct')->with(['accessoriLang', 'accessoriProducts.productsLang'])->get();