PHP OOP - 实现2个类的最佳方法

时间:2014-07-24 20:51:19

标签: php mysql

我有一个简单的数据库,包含用户数据表,控制器数据表和user_controller表,它们具有controllerID和userId。

在我的PHP OOP(第一次)实现中,我有一个类User和一个类Controller。

用户的功能很简单 - 他可以登录并注销并查看所有控制器的表格。 我有一个管理员用户,可以看到所有用户及其控制器,他可以添加/删除/编辑控制器给用户,也可以添加\ delete \ edit用户。

实现了Login功能(DB类,用户类和助手类)

我的问题是我应该如何以及在何处构建向用户添加控制器的功能。 Controller具有id(唯一),名称(不唯一)和密码。

用户私人字段为:

private $_db,
        $_data, //all of this user data
        $_sessionName,
        $_cookieName,
        $_isLoggedIn;

和控制器类:

private $_db,
        $_data; //all of this controller data

我尝试在控制器中实现Create:

public function create($fields = array()){
        if(!$this->_db->insert('controllers',$fields)){
            throw new Exception("Problem creating new controller");}}

并在用户中使用createController:

public function addController($pass,$controller_name,$lat='',$lon=''){
    if ($pass && $controller_name){
        $controller = new Controller();

        $salt = Hash::salt(32);

        try{
            $controller->create(array(
                    'pass' => Hash::make($pass,$salt),
                    'salt' => $salt,
                    'controller_name' => $controller_name,
                    'lat' => $lat,
                    'lon' => $lon
                    ));
        //if success then we update user-controller table
            $controller_id = $controller->find($controller_name)->data()->id;
            $userID = $this->data()->ID;
            $fields = array(
                'UserID' => $userID,
                'ControllerID' => $controller_id
                );

            if(!$this->_db->insert('user_controllers',$fields)){
                throw new Exception("Problem creating controller for user");
            }
        }
        catch(Exception $e){
            throw new Exception('There was a problem creating new controller'); 
        }
    } else {
        throw new Exception('No name or password had been given');
    }

一般情况下都有效。但是有几个问题:

  1. 控制器的ID是由DB自动创建的,所以当我创建它时我不知道它。我后来无法通过名字找到控制器,因为我可以拥有许多具有此名称的控制器

  2. 我不确定这是处理用户与控制器之间关系的正确方法

  3. 我无法实施"告诉我所有的控制器"为用户。

  4. 请告诉我实现此关系的正确方法是什么,以及如何创建用户的createController和ShowControllers?

1 个答案:

答案 0 :(得分:0)

你的结构似乎是正确的。你需要一个用户表,一个控制器表和一个user_controller表来映射两者之间的关系(用户有很多控制器)。

解决问题的方法:

  1. 插入数据时,需要检索要在映射关系中使用的新记录的插入ID。我在你的例子中不确定你是否自己或其他地写过这个MVC结构;它看起来有点像CodeIgniter。如果是CI应用程序,here's an example of how to get the last insert ID。如果是定制应用,您可以使用$mysqli->insert_id (mysqli)$pdo->lastInsertId(); for PDO.

  2. 您正在做的事情是正确的。

  3. 在"告诉我所有的控制器"对于用户场景,您将查询user_controller表以获取所有控制器关系的列表,并且您将使用连接(内部可能适合强制成功连接)。您指定要在选择字段中返回controller.*,并且您最终会得到每个控制器的记录并忽略用户控制器字段(如果您不需要它们)。示例SQL查询可能如下所示:

    SELECT controller.* FROM user_controller UC
    INNER JOIN controller ON controller.id = user_controller.controller_id
    WHERE user_controller.user_id = [YOUR_USER_ID_HERE]