我有型号Term
,Concept
和Expression
。我有透视表concept_expression
和concept_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
。
1条答案
按热度按时间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”包或任何其他类似的包,你将不得不求助于替代方法,如原始查询或额外的中间查询,这可能不那么优雅,实现和维护起来更麻烦。