문제

PHP에서 ORM을 생성하고 있으며 기본적으로 데이터베이스 테이블에 해당하는 객체를 생성하는 클래스 'ORM'이 있습니다 (ActivereCord 패턴과 유사한/동일한 기능을 목표로하고 있습니다.) ORM 자체는 확장됩니다. 데이터베이스 연결을 설정하는 데이터베이스 '

그래서 저는 다음과 같이 전화 할 수 있습니다.

$c = new Customer();
$c->name = 'John Smith';
$c->save();

ORM 클래스는이 기능을 제공합니다 (클래스 속성을 설정하고 save (), find (), findall () 등을 제공하고 고객을 확장합니다. 그러나 앞으로 나는 고객 (또는 내가 만든 다른 모델)에 추가 공개 방법을 추가하고 싶을 수도 있고, 이것이 ORM을 확장해야합니까?

나는 여기에 많은 정보를 제공하지 않았다는 것을 알고 있지만, 300 줄 이상의 코드를 게시하는 것과는 달리 모호한 설명에서 이해할 수 있기를 바랍니다.

도움이 되었습니까?

해결책

여기에 다른 답변에 동의합니다. 추가 방법을 자손 수업에 넣습니다. 나는 또한 그에 별표를 추가 할 것입니다 : 추가 방법으로 클래스를 확장 할 때마다 확장으로 달성하려는 것을 생각하고, 일반화 될 수 있는지, 부모 수업에 다시 작업 할 수 있는지 생각해보십시오. . 예를 들어:

// Customer.class.php
function getByName($name) {
    // SELECT * FROM `customer` WHERE `name` = $name
}

// ** this could instead be written as: **
// ORM.class.php
function getByField($field, $value) {
    // SELECT * FROM `$this->table` WHERE `$field` = $value
}

다른 팁

당신은 확실히 당신의 비즈니스 논리를 당신의 'orm'이외의 새로운 수업에 넣을 것을 올바르게 생각하고 있습니다. 저에게는 단순히 ORM 클래스를 확장하는 대신 새로운 가치 객체 클래스로 캡슐화하여 데이터베이스 디자인으로부터 추가적인 자유를 제공하여 클래스를 순수한 비즈니스 객체로 생각할 수 있습니다.

아니요. 상속 대신 구성을 사용해야합니다. 다음 예를 참조하십시오.

class Customer {
    public $name;
    public function save() {
        $orm = new ORM('customers', 'id'); // table name and primary key
        $orm->name = $this->name;
        $orm->save();
    }
}

그리고 ORM 클래스는 연장되지 않아야합니다 Database. 작곡은이 유스 케이스에 다시 가장 적합합니다.

예, 비즈니스 로직을 자손 수업에 넣으십시오. 이것은 대부분의 데이터 액세스 계층 생성 프레임 워크에서 볼 수있는 매우 일반적인 패턴입니다.

ORM 클래스를 절대적으로 확장해야합니다. 다른 것은 다른 클래스의 대상이어야합니다. 고객은 제품과는 매우 다르며 단일 ORM 클래스에서 모두 지원하는 것은 불필요한 부풀어 오르고 OOP의 목적을 완전히 물리 칠 것입니다.

또 다른 좋은 일은 저장 후 저장 후 후크를 추가하는 것입니다.

PHP에 대한 제한된 지식을 감안할 때 이것이 관련되어 있는지 확실하지 않지만 많은 비즈니스 객체를 만들려고한다면이 과정이 엄청나게 소비되는 프로세스 일 수 있습니다. 아마도 당신은 다음과 같은 프레임 워크를 고려해야 할 것입니다 케이크 그리고 다른 사람들은 그것을 좋아합니다. 여전히 비즈니스 로직을 만드는 과정에 있다면 좋습니다.

당신은 분명히 여기에 상속이있는 올바른 줄을 따라 생각하고 있습니다.

하나만 건축하기 위해 ORM을 짓는 경우 (또는 다른 사람이 물건을 처리하는 방식을 좋아하지 않기 때문에) 대부분의 코드를 바로 생성 할 수있는 사전 제작 된 ORM을 볼 수 있습니다. 데이터베이스 스키마. 그것은 당신에게 보트로드를 절약 할 수 있습니다. 기침 현재 제가 가장 좋아하는 것입니다.

나는 내에서 이것을 해결했다 Pork.dbobject. 그것을 확인하고 내가 이미했던 뇌 크 런칭 중 일부를 잡아라.

class Poll extends dbObject // dbObject is my ORM. Poll can extend it so it gets all properties.
{
        function __construct($ID=false)
        {
            $this->__setupDatabase('polls', // db table
                array('ID_Poll' => 'ID',    // db field => object property
                        'strPollQuestion' => 'strpollquestion', 
                        'datPublished' => 'datpublished', 
                        'datCloseDate' => 'datclosedate', 
                        'enmClosed' => 'enmclosed', 
                        'enmGoedgekeurd' => 'enmgoedgekeurd'),
                        'ID_Poll',  // primary db key 
                        $ID);   // primary key value
        $this->addRelation('Pollitem'); //Connect PollItem to Poll 1;1
        $this->addRelation('Pollvote', 'PollUser'); // connect pollVote via PollUser (many:many)


        }

function Display()
{

 // do your displayíng for poll here:
    $pollItems = $this->Find("PollItem"); // find all poll items
    $alreadyvoted = $this->Find("PollVote", array("IP"=>$_SERVER['REMOTE_ADDR'])); // find all votes for current ip
}

이러한 방식으로 모든 데이터베이스 또는 ORM 기능은 폴링 객체에서 멀리 떨어져 있습니다. 그렇지 않습니다 필요 아는 것. Fields / Mappings를 연결하는 SetupDatabase 만 있습니다. 그리고 다른 dbobjects와의 관계를 연결하기위한 부가관.

또한 dbobject 클래스조차도 SQL에 대해 많이 알지 못합니다. 선택 / 조인 쿼리는 특수 QueryBuilder 객체로 구축됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top