Laravel Eloquent 嵌套关系枢轴与约束

Posted

技术标签:

【中文标题】Laravel Eloquent 嵌套关系枢轴与约束【英文标题】:Laravel Eloquent nested relation pivot with constraint 【发布时间】:2014-10-23 06:57:38 【问题描述】:

我目前正在使用 laravel 4 我正在尝试检索带有约束的集合,但它没有按预期工作

模型特征:

public function valeur() 

    return $this->hasMany('Valeur','id_caracteristique','id');


模型价值

public function caracteristique() 

    return $this->belongsTo('Caracteristique','id','id_caracteristique');



public function produit() 

    return $this->belongsToMany('Produit','produit_valeur');


型号类别

public function produit() 

    return $this->belongsToMany('Produit','produit_categorie');

模型产品

public function valeur() 

    return $this->belongsToMany('Valeur','produit_valeur');

我想要:

Caracteristique,其中 categorie = x 到 produit 的值

最终目标:能够像

一样解析集合

特征->价值;

在 SQL 中

SELECT c.id,v.id FROM caracteristique c
INNER JOIN valeur v on (v.id_caracteristique = c.id)
INNER JOIN produit_valeur pv on (pv.valeur_id = v.id)
INNER JOIN produit_categorie pc on (pc.produit_id = pv.produit_id)
GROUP by c.id

当我在雄辩的关系中使用加入时不再可用

我已经试过了:

$carac = Caracteristique::with(array('valeur.produit.categorie' => function($q) 

$q->whereCategorieId(2);

 ))->get();

但是没有遵守约束..

有什么想法吗?

问候,

找到这个糟糕的解决方案...

$values = Valeur::whereHas('produit',function($q) 
$q->whereHas('categorie',function($q) 
    $q->where('categorie.id','=',2);

);
)->lists('id');

$carac = Caracteristique::with(array('valeur' =>function ($q) use($values) 
$q->wherein('id',$values);

))->get();

有最佳实践的人吗?

【问题讨论】:

【参考方案1】:

如果你想限制Caracteristique:

$catId = 2;

Caracteristique::whereHas('valeur', function ($q) use ($catId) 
  $q->whereHas('produit', function ($q) use ($catId) 
    $q->whereHas('categorie', function ($q) use ($catId) 
      $q->where('cateogorie.id', $catId);
    );
  );
)->get();

或者如果您想加载所有Caracteristique 并仅限制相关Valeur

Caracteristique::with(['valeur' => function ($q) use ($catId) 
  $q->whereHas('produit', function ($q) use ($catId) 
    $q->whereHas('categorie', function ($q) use ($catId) 
      $q->where('cateogorie.id', $catId);
    );
  );
])->get();

如您所见,这不是最好的代码,因此只需使用连接即可。

【讨论】:

嗨,谢谢回复,非常惊讶 laravel 没有为嵌套约束提供最佳解决方案,查询很糟糕! 查询本身并没有那么糟糕,但是你需要做的代码是。我的 PR 可以让它变得更容易,但 Taylor 还没有合并它 github.com/laravel/framework/pull/4954 我已经使用 laravel 原生关系构建了一个基本的、产品、类别、属性系统。你认为这是错误的做法吗? Eloquent 非常适合用于基本内容和快速设置。但是,当应用程序需要复杂的逻辑时,我会使用存储库和自定义方法,最后如果需要进一步改进,通常用 Doctrine 替换 Eloquent,这有点不同。话虽如此,我不会说这是错误的方式,但是将来您可能会发现它不足以满足您的需求。 好吧,我明白了,第一个查询没有用categorieID过滤,返回所有的caracteristique/valeur的数据很奇怪......

以上是关于Laravel Eloquent 嵌套关系枢轴与约束的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent Query 包含枢轴和关系

Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表

按 id 分组 Laravel Eloquent 枢轴值

Laravel Eloquent:渴望加载多个嵌套关系

Laravel Eloquent - 如何获得嵌套关系

Laravel Eloquent - 使用过滤数据获取嵌套关系