从Laravel / Eloquent中的联接表中选择列

时间:2019-08-05 09:49:19

标签: laravel eloquent

在尝试从数据库中获取特定数据时,Laravel出现了问题。

在我能解释我的情况之前,这里有一些有关我的数据库结构示例的上下文。

attribute:ID,名称,...
attribute_value:id,值,attribute_id,parent_id,...

attribute_value.attribute_id是对attribute.id的引用。 attribute_value.parent_id是对attribute_value.id的引用。

对于每个attribute,我需要获取其父项attribute。这是一个SQL查询,可满足我的需求:

SELECT
    attribute.id,
    attribute.name,
    attribute.custom_name,
    parent_attribute.id,
    parent_attribute.name,
    parent_attribute.custom_name
FROM
    attribute
LEFT JOIN attribute_value ON attribute_value.attribute_id = attribute.id
LEFT JOIN attribute_value as parent_attribute_value ON parent_attribute_value.id = attribute_value.parent_id
LEFT JOIN attribute as parent_attribute ON parent_attribute_value.attribute_id = parent_attribute.id
GROUP BY attribute.id

哪一种让我得到这种结果(最后两列来自父级的属性):

enter image description here

我的问题是要通过Laravel的Eloquent ORM来解决这个问题。我尝试使用原始选择:

DB::select(<<<EOT
SELECT
    attribute.id,
    attribute.name,
    attribute.custom_name,
    parent_attribute.id,
    parent_attribute.name,
    parent_attribute.custom_name
FROM
    attribute
LEFT JOIN attribute_value ON attribute_value.attribute_id = attribute.id
LEFT JOIN attribute_value as parent_attribute_value ON parent_attribute_value.id = attribute_value.parent_id
LEFT JOIN attribute as parent_attribute ON parent_attribute_value.attribute_id = parent_attribute.id
GROUP BY attribute.id
EOT);

但是,这并不使我进入parent_attribute的列。我还尝试在hasOneThrough模型上创建attribute关系,但是在尝试访问此字段时收到错误消息:

  

“ SQLSTATE [42000]:语法错误或访问冲突:1066不是唯一的表/别名:\'attribute'(SQL:选择`attribute_value`。*,`attribute`.`name`,`attribute`.custom_name `,`attribute..type`,`attribute`.is_custom`,`attribute`.is_activated`,IF(“ Direction” = attribute.name,1,0)AS is_hierarchical_organisation_attribute,`attribute`.`a_t_t_r_i_b_u_t_e_id`作为来自id属性=属性值上的attribute_value内连接attribute中的laravel_through_key的。id等于attribute_value值为null,其中“属性”。`deleted_at`为null并为“属性”。`a_t_t_t_r_i_b_u_t_e_id`= 3和`attribute_value`。`deleted_at`为null且属性为“ .is_activated` = 1)”

我真的不知道该怎么办,我很惊讶一个简单的原始查询无法正常工作。谁能帮助我实现这一目标?

谢谢:)

0 个答案:

没有答案