2009-09-10 2 views
0

나는 CakePHP 기반 웹 게임을 재미있게 만들기 위해서뿐만 아니라 연습용으로 만들려고 시도하지만, 장비 시스템을 알아 내려고 수수께끼에 빠져 있습니다.CakePHP에서 장비 시스템을 구현하는 방법

항목 유형 및 해당 항목에 대한 정보를 결정하는 정수 값을 포함하는 item_type 필드를 포함하여 항목에 대한 모든 가능한 정보를 포함하는 Items 테이블이 있습니다.

즉 item_type = '1'은 항목이 모자, 즉 전력, 가격, 보너스 및 요구 사항 만 필요한 정보라는 것을 의미합니다. 이 모든 것이 잘 작동합니다.

또한 각 플레이어의 현재 소유하고있는 항목을 모두 저장하기 위해 items_users HABTM 테이블이 설정되어 있는데, 이것도 정상적으로 작동합니다.

내가 알아 내려고하는 것은 장비 시스템이 어떻게 작동하는지입니다. 나는 처음과 같은 테이블을 갖추고있다 생각 :

CREATE TABLE `aevum_tf`.`equips` (
`id` INT NOT NULL , 
`user_id` INT NOT NULL , 
`hat_id` INT NOT NULL , 
`wep_id` INT NOT NULL , 
`offhand_id` INT NOT NULL , 
`pants_id` INT NOT NULL , 
`acca_id` INT NOT NULL , 
`accb_id` INT NOT NULL , 
`accc_id` INT NOT NULL , 
`shirt_id` INT NOT NULL , 
`created` DATETIME NOT NULL , 
`modified` DATETIME NOT NULL , 
PRIMARY KEY (`id`) , 
UNIQUE (
`user_id` 
) 
) ENGINE = InnoDB 

이 CakePHP를이 모델에 대해 여러 외래 키를 지원하지 않는다는 것입니다 같은 시스템을 사용하는 유일한 문제.

그런 시스템을 구현하는 방법에 대한 아이디어가있는 사람이 있습니까?

EDIT 기존 HABTM items_users 테이블은 사용자가 현재 소유하고있는 항목을 저장하는 데 사용됩니다. 사용자가 새 항목을 가져올 때마다 ID는 id이고 사용자 ID는 items_users 테이블에 저장됩니다. 저는 장비 시스템을 구현하는 방법을 알아 내려고하고 있습니다.

By는 여러 개의 외래 키를 지원하지 않으므로 CakePHP는 기본적으로 다른 테이블의 한 테이블에서 여러 개의 외래 키를 지원하지 않습니다. 내 예제 equips 테이블은 모두 item_id를 가리키는 8 개의 외래 키를 가지고있다.

은 다음을 참조하십시오 https://trac.cakephp.org/ticket/1923

+0

"여러 개의 외래 키를 지원하지 않습니다"를 명확히하십시오. 원하는만큼 많은 외래 키를 가질 수 있습니다. 아마도 HABTM 테이블에 없을 것입니다. – deceze

답변

3

내가 HABTM 관계가없는 당신 같은 복잡한 것들 위에서 설명하는 간단한 관계에 가장 적합 것으로 나타났습니다. HABTM 관계에 대한 아이디어는 조인 테이블을 거의 보이지 않게하여 여분의 외래 키를 유지할 필요가 없도록하는 것입니다. 간단한 경우에는 잘 작동합니다.

귀하의 경우 시스템의 다른 모든 측면에 참여할 장비 테이블이 있습니다. 디자인에서는 출발점이 필요합니다. 나는 "사용자"가 출발점이 될 것이며 사용자는 많은 장비를 가지고 있다고 상상할 것이다. 사용자가 장비를 하나만 가질 수 있도록 제한 할 수 있습니다.이 경우 거의 사용자를 병합하고 테이블을 단일 장비로 통합 할 수 있습니다.

어떤 경우 든 규칙을 정의하여 시작해야합니다.

사용자 -> hasOne의 -> 갖추고있다 갖추고있다 ->에 BelongsTo -> 사용자

다음과 같은 관계가 될 것 같은 데이터베이스의 deisgn에 따르면,이 보인다. 을 갖추고있다 ->에 BelongsTo -> 모자 을 갖추고있다 ->에 BelongsTo -> 바지 을 갖추고있다 ->에 BelongsTo -> WEP WEP ->이 hasMany의 -에게>는 ...

최고의 응용 프로그램을 빌드하려면, 내가 무엇을 제안 갖추고있다 가능한 모든 관계를 구축하고 각보기에서 결과 데이터 세트를 보는 것입니다 ...

$this->User->recursive = 2; 
pr($this->User->find("first"); 

거기에서 나는 모양이 좋고 이해할 수있는 구조를 만들기 위해 테이블을 다시 디자인 할 것입니다. 그런 다음 불필요한 관계를 제거하십시오.

또한 바인딩 및 바인딩 해제 모델을 조사하는 데 시간을 투자하십시오. 이렇게하면 데이터베이스 설계가 안정되면 데이터와 관계를보다 효과적으로 사용자 정의 할 수 있습니다.

희망이 조금 도움이됩니다.

+0

그래, 나는 equips 관계에 매우 복잡한 항목없이 단순히 그것을하는 다른 방법을 생각할 수 없다. 아이템 테이블의 다른 그룹으로 아이템 테이블을 분할하려고합니다. 어떻게 작동하는지보십시오. –

관련 문제