php Laravel Eloquent多个whereHas与Where条件

mcdcgff0  于 2023-08-02  发布在  PHP
关注(0)|答案(1)|浏览(169)

我有型号TermConceptExpression。我有透视表concept_expressionconcept_term

架构

  • terms
  • id
  • term
  • concepts
  • id
  • expressions
  • id
  • expression_plural

关系

  • Term型号
  • concepts(): BelongsToMany
  • expressions(): HasManyThrough
  • Concept型号
  • terms(): BelongsToMany
  • expressions(): BelongsToMany
  • Expression型号
  • concepts(): BelongsToMany
  • terms(): HasManyThrough

我想找到某个Expression类别的Terms,但首先,应该找到一个概念,因为一个概念与一个表达式相关联。
在我的CategoryController中,我尝试使用Eloquent:

$terms = Term::whereHas('concepts')
    ->whereHas('expressions', function ($query) use ($expression_plural) {
        $query->where('expression_plural', 'materials');
    })
    ->take(16)
    ->toSql();

字符串
正在进行的查询如下:

SELECT *
FROM   `terms`
WHERE  EXISTS (SELECT *
               FROM   `concepts`
                      INNER JOIN `concept_term`
                              ON `concepts`.`id` = `concept_term`.`concept_id`
               WHERE  `terms`.`id` = `concept_term`.`term_id`)
       AND EXISTS (SELECT *
                   FROM   `expressions`
                          INNER JOIN `concepts`
                                  ON `concepts`.`id` =
                                     `expressions`.`concept_id`
                   WHERE  `terms`.`id` = `concepts`.`term_id`
                          AND `expression_plural` = 'materials')
LIMIT  16


但是当我在HeidiSQL中检查查询时,我得到了这个错误消息:
“where子句”中的未知列“concepts.term_id”
老实说,我对这些关系感到困惑。当一个术语的某些表达式之间也有一个概念时,要找到它们,需要什么步骤?
在我的控制器中,我也尝试了,例如:

$expression = Expression::where('expression_plural', $expression_plural)->first();
$concepts = $expression->concepts->take(10);


在我看来,我只是循环了$concepts来找到$terms,但我只是想让$terms直接出现在我的视图中,而不需要循环$concepts

hmae6n7t

hmae6n7t1#

您遇到的错误Unknown column 'concepts.term_id' in 'where clause'表明term_id列不存在于concepts表中,这是因为您试图在此上下文中使用HasManyThrough的方式,这并不直接适用。
问题在于HasManyThrough被设计为处理模型之间的直接关系,而您的模型具有BelongsToMany关系,这导致了问题。查看官方文档以了解它是如何工作的。
我的建议是使用staudenmeir的“eloquent-has-many-deep”包,它为类似您的场景提供了一个解决方案,允许您定义更复杂的关系。
通过使用包中的hasManyDeep方法,您可以定义模型之间的复杂关系,并直接在视图中获得所需的结果,而无需循环遍历概念。
如果你选择不使用“foreign-has-many-deep”包或任何其他类似的包,你将不得不求助于替代方法,如原始查询或额外的中间查询,这可能不那么优雅,实现和维护起来更麻烦。

相关问题