2016-11-29 5 views
0

여러 엔터티 (Product, Company, ...)에 대해 EAV 시스템을 개발 중입니다. 끝에 문제를 알려 드리겠습니다.Mysql 다중 조인 테이블에서 작업하지 않는 경우

데이터베이스 구조는 다음

EAV_ENTITY

이 표는 나에게 같은 사용 가능한 모든 엔티티의 목록을 줄 것이다 :

1 | Product 
2 | Company 

구조 :

+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| id | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| model | varchar(255)  | NO |  |   |    | 
+-------+------------------+------+-----+---------+----------------+ 

EAV_ATTRIBUTE

이 테이블에는 특성 목록이 있으며 ref는 쿼리로 특성을 쉽게 가져 오는 니모닉입니다. 각 속성을 하나의 엔티티로 제한하기를 원하기 때문에 여기에 eav_entity 테이블과 관련된 entity_type_id를 추가합니다.

+----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+----------------+------------------+------+-----+---------+----------------+ 
| id    | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| entity_type_id | int(11) unsigned | NO | MUL | NULL |    | 
| ref   | varchar(50)  | NO | UNI |   |    | 
| name   | varchar(255)  | NO | UNI |   |    | 
+----------------+------------------+------+-----+---------+----------------+ 

EAV_VALUE

이 테이블 속성에 관련된 값이, 값이 될 것이다있다 : 빨강, 녹색, 오렌지, 속성 "색"

+-----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+-----------------+------------------+------+-----+---------+----------------+ 
| id    | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| attribute_id | int(11) unsigned | NO | MUL | NULL |    | 
| value   | varchar(255)  | NO | MUL | NULL |    | 
+-----------------+------------------+------+-----+---------+----------------+ 

EAV_ATTRIBUTE_VALUE

+----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+----------------+------------------+------+-----+---------+----------------+ 
| id    | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| entity_id  | int(11) unsigned | YES |  | NULL |    | 
| entity_type_id | int(11) unsigned | YES | MUL | NULL |    | 
| value_id  | int(11)   | YES |  | NULL |    | 
+----------------+------------------+------+-----+---------+----------------+ 

여기 나는 모든 "마법"을 만들고, 엔티티 (유형, id)와 관련된 모든 값과 값이 속한 속성 사이의 관계를 만드는 쿼리를 만든다.

내 쿼리 내가 문을 추가 할 때이 하나

SELECT 
    e.model, 
    av.entity_id, 
    a.id as category_id, 
    a.ref as category_ref, 
    v.id as value_id 

FROM eav_entity as e 

RIGHT JOIN eav_attribute_value as av 
ON e.id = av.entity_type_id 

LEFT JOIN eav_value as v 
ON v.id = av.value_id 

LEFT JOIN eav_attribute as a 
ON v.attribute_id = a.id 

WHERE e.model = 'App\Product' 

문제 & 질문

입니다 e.model = 내가 어떤 결과를 얻을 그나마 '무엇이든'. 그리고 그것은 필터로되어 있습니다. 그러나 WHERE 문을 사용하지 않으면 예상대로 결과를 얻습니다. 내가 조인을하는 방식과 관련된 문제 일 수 있다고 생각합니다.

e.model이 @Uuerdo 말했다

+-------------+-----------+-------------+---------------------------+----------+ 
| model  | entity_id | category_id | category_ref    | value_id | 
+-------------+-----------+-------------+---------------------------+----------+ 
| App\Product |  13 |   2 | product_development_phase |  2 | 
| App\Product |  13 |   2 | product_development_phase |  3 | 
| App\Product |  13 |   4 | product_therapeutics  |  58 | 
| App\Company |  13 |   4 | product_therapeutics  |  58 | 
+-------------+-----------+-------------+---------------------------+----------+ 
+0

문제는 무엇인가? – kbball

+1

시도해'어디 e.model = 'App \\ Product'' – Uueerdo

+0

@Uueerdo 답변으로 게시, 내 질문을 해결, 많은 감사합니다! – jsertx

답변

0

AS WHERE없이 실제 예를 들어, 나는 진짜 백 슬래시로 두 번째를 해석하는 이스케이프 문자로 백 슬래시를 추가해야합니다.

쿼리는 아래의 다음 발생합니다 :

SELECT 
    e.model, 
    av.entity_id, 
    a.id as category_id, 
    a.ref as category_ref, 
    v.id as value_id 

FROM eav_entity as e 

RIGHT JOIN eav_attribute_value as av 
    ON e.id = av.entity_type_id 

LEFT JOIN eav_value as v 
    ON v.id = av.value_id 

LEFT JOIN eav_attribute as a 
    ON v.attribute_id = a.id 

WHERE e.model = "App\\Product" 
+0

여기에 최종 검색어를 수락 된 답변으로 표시하십시오. 나는 설명으로 정교한 대답을 할 시간이 없었다. – Uueerdo