2017-07-01 8 views
0

私はWebプログラミングとMVCアーキテクチャの初心者です。MVC:私のコードを入れるモデルは?

私はMVCアーキテクチャ(PHPとMySQLと一緒に)を使用してWebアプリケーションを作成しています。

フォームに提供される「利用可能な」連絡担当者を列挙し、フォームの選択した「担当者」フィールドに選択を行う人のリストを入力するSELECTステートメントを作成しました。 MySQLのコマンドラインからこれをテストしたので、私が書いたSELECT文は正常に動作します。

このコードを配置するための適切なモデル(この質問の最後にあるPHPコード)は、私が確信しているものです。ユーザーまたは会社?

私は「会社」テーブルに、以下のユニーク制約を持つよう会社が適切な場所であろうと思う:ここ

CONSTRAINT uc_company_contact_person_id UNIQUE (contact_person_id) 
COMMENT 'A user can only be a contact person for one company.' 

は私のモデルと関連テーブルのほんの一部です:

会社:典型的な会社のフィールドと「contact_person_id」フィールド(必須ですが、それが存在する場合、それはユニークなuser.id関連付けられている必要がありますNOT)

ユーザー:典型的なユーザーフィールドと「ROLE_ID」(ユーザーが割り当てられた役割を持っている必要がありますし、彼らが所属する割り当てられた会社を持っている必要があります)

役割:役割の一覧

許可 :許可のリスト

role_permissionテーブルは役割へのアクセス許可をバインドします。

"利用可能な"連絡担当者のリストを生成する私の関数の例。それがどのモデルに属しているかはっきりしていませんか?

public function listAvailableContactPersons($selectedContactPerson) 
{ 
    blah, blah, blah 

    SELECT  user_account.id AS "User_ID", CONCAT(user_account.last_name, ", ", user_account.first_name) AS "Contact_Person" 
    FROM  user_account, role 
    WHERE  user_account.role_id = role.id 
    AND   role.name NOT IN ('OWNER', 'DEVELOPER', 'WEBSITE_ADMIN') 
    AND   user_account.id NOT IN (SELECT   user_account.id 
             FROM   company 
             LEFT OUTER JOIN user_account 
             ON    user_account.company_id = company.id 
             WHERE   company.contact_person_id = user_account.id) 
    OR   (user_account.role_id = role.id AND user_account.id = :selectedContactPerson) 
    ORDER BY user_account.last_name; 

    blah, blah, blah 

    $stmt->bindValue(':selectedContactPerson', $selectedContactPerson, PDO::PARAM_STR); 


    blah, blah, blah 

    return $stmt->fetchAll(); 
} 

マイク

答えて

1

FWIW、あなたの助けのために事前にありがとうございます、私は担当者のIDは、スキーマごとに、会社の財産であると考えるでしょう:

会社:代表的な会社のフィールドと「contact_person_id」フィールド

しかし、メソッドを記述した方法では、メソッドがUsersに属しているようです。

(私は少し逆クエリをエンジニアリング失われてしまった、それはuser_account.id年代のリストの大きさに影響を与えることはありませんようnot in(select ... left outer join...)left outer joinは余計そうです、私はあなたのメソッドが何をしているか完全にわからないようにします。。 )

何かを考慮する必要があるのは、従属性注入を使用してユーザーデータを会社オブジェクトに取得すること、つまりユーザーオブジェクトを関数に渡すことです。これにより単体テストが容易になります。

// consider this pseudo code; I use my own db abstraction so I don't remember 
// how to do this in PDO... 

Class Company { 
    public function listAvailableContactPersons($userObject) { 
    $query = "SELECT contact_person_id FROM companies"; 
    // prepare, bind, execute... 
    while($record = $stmt->fetch()) { 
     $user[] = $userObject->find($record->contact_person_id)->fullName(); 
    } 
    return $user; 
    } 

これは、作成するデータベースコールの数です。より良い方法は、idのリストを取得し、そのリストをユーザーオブジェクトに渡すことです。

Class Company { 
    public function listAvailableContactPersons($userObject) { 
    $query = "SELECT contact_person_id FROM companies"; 
    // prepare, bind, execute... 
    while($record = $stmt->fetch()) { 
     $users[] = $record->contact_person_id; 
    } 

    return $userObject->findFromList($users)->fullName(); 
    } 

私はあなたのデータについていくつかの仮定をしました。うまくいけば、私は近くにいた。明らかに、私が参照したUserメソッドを作成する必要があります。これはちょうどあなたに何ができるかのアイデアを与えることでした。

関連する問題