0

3つのクラスがあると仮定しましょう:

スポンサー{ id[int]、name[string]、 [プロジェクトsponsoredProjectsオブジェクトの配列]}

プロジェクト{ id[int]、name[string]、desc[string]、 [スポンサーsponsorsオブジェクトの配列]}

学校{ id[int]、name[string]、 [プロジェクトオブジェクトprojectsDoneの配列}

私はスポンサーsponsoredProjectsプロジェクトの間で立ち往生していますsponsors

理論的には、プロジェクトを作成する場合は、そのスポンサーも作成する必要があります。スポンサーを作成する場合は、そのプロジェクトも作成する必要があります。

だから、それは彼らの中にスポンサーがいるプロジェクトと彼らの中にスポンサーがいるプロジェクトの無限の配列をもたらすでしょう。私は正しいですか?プロジェクトの配列を持つスポンサーの配列を持つプロジェクトの配列があるので、同じ問題が学校にも当てはまるはずです。

もしそうなら、どうすればこの欠陥を回避できますか?

私の目標は、返された複数のSQL結果からこれらすべてのオブジェクトを一時的に作成し、それをJavaScriptページに送信することです。

final class Sponsor{
    private $_id;
    private $_name;
    private $_projects;

    public function __construct($id, $name, Project $projects){
        $this->setSponsor($id, $name, $projects);
    }

    public function getId(){
        return $this->_id;
    }

    public function getName(){
        return $this->_name;
    }

    public function getProjects(){
        return $this->_projects;
    }

    private function setId($id){
        $this->_id = $id;
    }

    private function setName($name){
        $this->_name = $name;
    }

    private function setProject(Project $projects){
        $this->_projects = array();
        foreach($projects as $val){
            array_push($this->_projects, $val);
        }
    }

    private function setSponsor($id, $name, Project $projects){
        $this->setId($id);
        $this->setName($name);
        $this->setProjects($projects);
    }
}

final class Project{
    private $_id;
    private $_name;
    private $_desc;
    private $_sponsors;

    public function __construct($id, $name, $desc, Sponsor $sponsors){
        $this->setProject($id, $name, $desc, $sponsors);
    }

    private function setId($id){
        $this->_id = $id;
    }

    private function setName($name){
        $this->_name = $name;
    }

    private function setDesc($desc){
        $this->_desc = $desc;
    }

    private function setSponsors(Sponsor $sponsors){
        $this->_sponsors = array();
        foreach($sponsors as $obj){
            $id = $obj->getId();
            $name = $obj->getName();
            $projects = $obj->getProjects();
            array_push($this->_sponsors, new Sponsor($id, $name, Project $this));
        }
    }

    private function setProject($id, $name, $desc, Sponsor $sponsors){
        $this->setId($id);
        $this->setName($name);
        $this->setDesc($desc);
        $this->setSponsors($sponsors);
    }
}

final class School{

    private $_id;
    private $_name; 
    private $_projectsDone;

    public function __construct($id, $name, Project $projects){
        $this->setSchool($id, $name, $projects);
    }

    private function setId($id){
        $this->_id = $id;
    }

    private function setName($name){
        $this->_name = $name;
    }

    private function setProjectsDone($projects){
        $this->_projectsDone = array();
        foreach($projectsDone as $val){
            $this->{_projectsDone}[] = $val;
        }
    }

    public function setSchool($id, $name, $projectsDone){
        $this->setId($id);
        $this->setName($name);
        $this->setProjectsDone($projectsDone);
    }
}
4

2 に答える 2

2

循環参照の問題があります。各オブジェクトが関連するオブジェクトの配列を保持する代わりに、それらのIDの配列を保持し、必要なときに関連するエンティティを検索してみてください。

于 2012-05-25T16:44:00.157 に答える
1

オブジェクトが相互に参照を保持することには何の問題もありません。これは非常に一般的であり、セットの通常の(反射的な)関係です。たとえば、javascriptのDOM ... Elementノードはその子を知っており、その子はその親を知っています。

鶏卵と卵の問題が少しあるので、明らかにそれらを構築して初期化するときに注意する必要がありますが、チェックは要約すると

if relation to object not established
    establish()

この情報をデータベースに保存するとおっしゃいました。あなたはおそらくチェックを避けることさえできます。たとえば、次の表があります。

Sponsor
Project
School
SponsoredProjects - many to many relation
SchoolProjectsDone - many to many relation

スポンサー、プロジェクト、および学校の​​オブジェクトを作成し、スポンサープロジェクトおよびSchoolProjectsDoneテーブルの関係をループして、オブジェクトを関連付けます。

于 2012-05-25T16:45:53.950 に答える