2017-07-01 43 views
0

我是网络编程和MVC体系结构的新手。MVC:哪个模型放置我的代码?

我正在创建一个使用MVC架构(以及PHP和MySQL)的Web应用程序。

我写了一条SELECT语句,列出了将提供给表单的“可用”联系人,并填充表单中选择的“联系人”字段,其中包含要从中进行选择的人员列表。我写的SELECT语句正常工作,因为我已经从MySQL命令行测试过了。

我不确定是放置这段代码的合适模型(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关联)

用户:典型用户字段和“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”字段

但是,您编写该方法的方式似乎使该方法属于用户。

(我有点失去了逆向工程的查询;在not in(select ... left outer join...)left outer join似乎是多余的,因为它绝不会影响user_account.id的列表的大小,使我不能完全肯定你的方法做。 )

需要考虑的事情是使用依赖注入来获取用户数据到公司对象中,即将用户对象传递给函数。这使得单元测试更容易。

// 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; 
    } 

这是你将要创建的db调用的数量。更好的方法是获取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(); 
    } 

我已经对您的数据做了一些假设;希望我接近。显然,你将不得不创建我引用的用户方法。这只是为了让你了解可以做些什么。