【问题标题】:Fill object with result from db [closed]用 db 的结果填充对象 [关闭]
【发布时间】:2014-12-12 18:58:05
【问题描述】:

假设我们有这个类:

class Cup {
    public $color;
    public $material;

    public function getMyCupById($id){
        //prepare statement
        $query = $db->prepare('SELECT * FROM cups WHER cup_id=?');
        $query->bindValue(1,$id);
        $query->execute();

        $cup = $pages->fetch(PDO::FETCH_OBJ);

        // The "problem" is from here
        $this->color = $cup->color;
        $this->material = $cup->material;
        // To here
    }
}

那么,这是从数据库“填充”对象的正确方法还是有更优雅的方法来做到这一点?

最后,执行代码为:

$cup = new Cup;

//other lines of code

$cup->getMyCupById($id);

【问题讨论】:

  • 我不明白...到底是什么问题???并发布任何错误消息
  • 所以它正在工作,但您不知道这是否是最好的方法?顺便说一句,该方法没有返回任何内容,这当然不是必需的,但它会更有意义。
  • 你正在做的工作,显然没有错误.. 不确定你在验证你正在做的事情之外的期望是什么。在我看来,唯一可以给出的答案是固执己见的。继续保持下去。
  • 没有错误信息。我只是想知道这是否是“更新”对象的正确方法。因为它首先是用 $cup = new Cup; 调用的。当 $cup 是具有默认值的对象时,并且在某些时候,它会使用方法“更新”。是的,我只是在征求意见和想法,因为我不确定这是否是正确的方法。

标签: php oop pdo


【解决方案1】:

除了在 Cup 类中包含数据库交互,您可以将其定义为:

class Cup {
    public $color;
    public $material;
}

并且有一个单独的数据访问类来处理数据库交互。

class CupDataAccess {
    private $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function getMyCupById($id) {
        $sql = 'SELECT color, material FROM cups WHERE cup_id=?'
        $query = $this->db->prepare($sql);
        $query->bindValue(1, $id);
        $query->execute();
        return $query->fetchObject('Cup');
        // Using fetchObject this way will automatically associate column
        // names from the fetched row with corresponding property names of
        // the specified class.            
    }    
}

所以你可以用

创建杯子
$cupDataAccess = new CupDataAccess($pdo);
$cup = $cupDataAccess->getMyCupById(1);

【讨论】:

  • 如果我只是替换 $cup = $pages->fetch(PDO::FETCH_OBJ); 会不会更好返回 $pages->fetch(PDO::FETCH_OBJ);然后 --> $cup = new Cup; $cup = $cup->getMyCupById($id);
  • 这会给您一个$cup,它不是Cup,而是一个stdClass,其属性名称与您的cups 表中的列相对应。如果这就是你所需要的,那似乎很好。我只是假设您的 Cup 类可能具有您未包含在问题中的其他方法/属性。
  • 这确实是更好的方法。数据对象不应该负责将自己从数据库中取出。你应该设计你的类,让它们只做他们需要做的事情。一个简单的例子应该是汽车,汽车可以驾驶、刹车、加速等。但是汽车不能自己从车库里出来。让汽车成为汽车,让车库弄清楚司机想要哪辆车
  • 我会说司机知道他想要哪辆车,而车库提供了汽车的通道。当然,除非您将 Car 类扩展为创建 Transformers 或 Knight Rider,否则这才是正确的,这显然会使事情复杂化。
猜你喜欢
  • 2021-09-24
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多