ถามว่าผิดมั๊ย ถ้ามัน query ออกมาได้ มันก็ไม่ผิดหรอกครับ -*-
แต่ประเด็นคือ ตัวอย่างมันน้อยเกินไป
ซึ่งหลักๆ เวลาจะใช้ PDO มันควรจะเป็นแบบนี้
1. bind paramter ทุกตัวที่รับ input เข้ามาจากภายนอก (user กรอก, get/post parameters ต่างๆ )
2. 1 request ควรมี PDO instance แค่ 1 ตัว ดังนั้นควรจะออกแบบให้ทุกๆ query ใช้ pdo ร่วมกัน
แต่ถ้าจะให้ถึงกึ๋น OOP ของจริง มันต้อง design ให้เป็น OO มากกว่านี้คับ หรือที่เค้าเรียกว่า ORM
ปรกติผมทำ ผมจะแบบนี้
<ในตัวอย่างผมใช้ Doctrine ORM>
controller --(call)--> DaoService
DaoService --(query from)--> DataBase --(put queried data into)--> Entity Object
DaoService --(return entity to)--> controller
ปล. Dao = Data Access Object
ตัวอย่าง
#controller
public function imagesAction()
{
$this->view->sharedImages = ImageService::getSharedImages($this->_myUser->getId());
$this->view->yourImages = ImageService::getYoursImages($this->_myUser->getId());
}
#DaoService
public static function getYoursImages($uploaderId){
$em = MyEntityManagerFactory::getEntityManager();
$dql = "select i from \Models\Entities\Image i"
.' join i.uploader u'
.' where u.id = ?1'
.' order by u.id desc';
$query = $em->createQuery($dql);
$query->setParameter(1, $uploaderId);
return $query->getResult();
}
#Entity Class: Image <ผมเอา getter/setter ออกนะครับ>
namespace Models\Entities;
/** @Entity
* @Table(name="images")
* */
class Image{
/** @Id
* @GeneratedValue(strategy="IDENTITY")
* @Column(name="id", type="integer") **/
private $id;
/** @Column(name="is_shared", type="boolean") **/
private $isShared;
/** @Column(name="`key`", type="string", length=6, unique=true, nullable=false) **/
private $key;
/** @Column(name="name", type="string") **/
private $name;
/** @Column(name="md5", type="string", unique=true, nullable=true) **/
private $md5;
/** @Column(name="uploaded_time", type="string") **/
private $uploadedTime;
/**
*
* @var Image
* @ManyToOne(targetEntity="Image")
* @JoinColumn(name="image_ref_id", referencedColumnName="id")
*/
private $referenceImage;
/**
*
* @var User
* @ManyToOne(targetEntity="User")
* @JoinColumn(name="uploader_user_id", referencedColumnName="id")
*/
private $uploader;
/** @Column(name="nick_name", type="string", nullable=false, length=100) **/
private $nickName;
คร่าวๆ มันก็จะประมาณนี้ ซึ่งจุดเด่นของการแบ่ง code เป็นหลายๆชั้นแบบนี้คือ มันจะอ่านง่ายมาก
ถ้าทำหลายๆคน ก็ comment เข้าไปหน่อย อ่านง่ายขึ้นมากเลย