如何通过RedBeanPHP ORM直接将现有对象存入数据库?
在RedBeanPHP中直接存储自定义对象的解决方案
RedBeanPHP 默认仅支持存储由 R::dispense() 创建的Bean对象,无法直接存储你自定义的Image类实例,但可以通过以下几种方式简化存储流程,避免手动逐个赋值:
1. 让自定义类继承RedBeanPHP的模型类
将你的Image类继承RedBeanPHP\SimpleModel,这样它就会成为RedBean可识别的模型对象,直接支持R::store()操作:
// 修改你的Image类 require_once 'rb-mysql.php'; class Image extends \RedBeanPHP\SimpleModel { // 原有私有属性 private $category; private $height; private $imageBoundary; private $imgaes; private $type; private $user; private $width; // 原有getter/setter方法 public function getCategory() { return $this->category; } public function setCategory($category) { $this->category = $category; } // ...其他getter/setter方法 }
之后就可以直接使用你期望的代码形式存储:
function insertImageTemplate(Image $image){ $isConnected = R::testConnection(); if($isConnected){ R::store($image); } }
2. 使用R::convertToBean()自动转换
利用RedBean提供的convertToBean()方法,将自定义对象的属性映射到Bean对象中:
情况1:自定义对象有公共属性
如果Image类的属性是公共的,直接传入对象即可:
function insertImageTemplate(Image $image){ $isConnected = R::testConnection(); if($isConnected){ $imageBean = R::convertToBean('images', $image); R::store($imageBean); } }
情况2:自定义对象属性为私有/受保护
可以给Image类添加一个返回属性数组的方法,再传入数组进行转换:
// 在Image类中添加方法 public function toArray() { return [ 'category' => $this->getCategory(), 'height' => $this->getHeight(), 'imageBoundary' => $this->getImageBoundary(), 'imgaes' => $this->getImgaes(), 'type' => $this->getType(), 'user' => $this->getUser(), 'width' => $this->getWidth() ]; }
然后修改存储函数:
function insertImageTemplate(Image $image){ $isConnected = R::testConnection(); if($isConnected){ $imageBean = R::convertToBean('images', $image->toArray()); R::store($imageBean); } }
3. 批量赋值简化代码
如果不想修改Image类,也可以通过循环批量赋值,替代手动逐个设置属性:
function insertImageTemplate(Image $image){ $isConnected = R::testConnection(); if($isConnected){ $imageToDatabase = R::dispense('images'); // 定义需要映射的字段列表 $fields = ['category', 'height', 'imageBoundary', 'imgaes', 'type', 'user', 'width']; foreach($fields as $field){ // 调用对应的getter方法 $getter = 'get' . ucfirst($field); $imageToDatabase->$field = $image->$getter(); } R::store($imageToDatabase); } }
内容的提问来源于stack exchange,提问作者FarHooD
相关产品推荐
相关产品推荐

