درس کارشناسی ۹۲-۱۳۹۱بهار
ىؼتی صداوشگا ششیف
داوشکذ مىذسی کامپیتش
۱۰قسمت Doctrine کامپاننتو Domain Logic الیه ی
Transaction Scriptمذل تشاکىش
2
function processRegister($name, $email) { checkForDuplicateName($name); insertIntoDatabase($name, $email); }
Transaction Scriptمذل Row Data Gateway
Table Data Gateway Record Set
ي مؼایةمضایا
3
Row Person Gateway
$name $email Insert() update() delete() static find($id)
Table Person Gateway
find($id): RecordSet insert($name, $email) update($id, $name, $email) delete($id)
Domain Modelمذل شیءگشا
Row Data Gatewayتفايت تا Data Mapper
اشیاء گشاف
4
Domain Modelمذل
5
class RegisteredUser { public function __construct ($name, $email); public function save(); public function checkForDuplicate(); public static function loadByName($name); }
Table Moduleمذل Record Setالگی
6
class RegisteredUsersTable { public function retrieveAll(); public function retrieveByName($name); public function saveAll($recordSet); }
اوتخاب
7
Data Mapper اشیاءمیان مىاتغ داد ي تثذیالت
Collections ا
يساثت
8
Active Record Row ت مشا مىطق
اایجاد اص پاسخ دسیافتی اص پایگا داد ومو
ایجاد ومو جذیذ findتشای استاتیکمتذای
ت سيص سساوی ي رخیش یک ومو داد ایدستشسی ت
مشتط مىطق ای
9
Unit of Work Concurrency/ مضماوی / مگامی
ششيع ي پایان
begin commit
rollback
10
Identity Map تکشاسی اشیاء
Performance
Inconsistency/ واساصگاسی
Lazy Load Performance
مشتط ت م اشیاء
11
DBAL اوتضاع اص پایگا داد
ORM Data Mapperیک
اتضاسای کمکی
Formا Validation
12
پایگا داد تىظیمات
13
# app/config/config.yml
# app/config/parameters.yml
parameters:
database_driver: pdo_mysql
database_host: localhost
database_name: d3
database_user: root
database_password: ~
ساخته پایگا داد
پایگا داد Character Setتىظیم
14
>php app/console
doctrine:database:create
Entityساخته Doctrineتا کمک
ت صست دستی
15
php app/console
doctrine:generate:entity
--entity="CEBlogBundle:Post“
CEBlogBundle:Post
CE/BlogBundle/Entity/Post
ي مشخصات فیلذ ا ymlوع تىظیمات
16
doctrine/Post.orm.yml
CE\BlogBundle\Entity\Post:
type: entity
table: post
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
lifecycleCallbacks: { }
ي مشخصات فیلذ ا annotationوع تىظیمات
17
use Doctrine\ORM\Mapping as ORM;
**/
* @ORM\Entity
* @ORM\Table(name="post")
/*
class Post {
**/
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
/*
protected $id;
**/
* @ORM\Column(type="string", length=100)
/*
protected $title;
Entityتکمیل
اAccessorساخته
متذای اضافی ...مىطق ي
18
>php app/console
doctrine:generate:entities
CEBlogBundle
Schemaساخته ت سيص سساوی دس پایگا داد
19
php app/console
doctrine:schema:update –force
CREATE TABLE Post (id INT
AUTO_INCREMENT NOT NULL,
title VARCHAR(255) NOT NULL,
…, PRIMARY KEY(id))
جذیذ ي قشاس دادن دس پایگا داد شیءایجاد
20
$p = new Post();
$p->setTitle(‘Blog Post #1');
$em = $this->getDoctrine()-
>getManager();
$em->persist($p);
$em->flush();
اشیاءرخیش شذ اشیاءدستشسی ت
21
$repo = $this->getDoctrine()->
getRepository(
‘CEBlogBundle:Post');
$repo->find($id);
$repo->findOneByTitle(‘Post 2');
$repo->findAll();
$repo->findOneBy(
[title' => ‘Post 2']);
ت سيص سساوی ي حزف
22
$p->setTitle(‘Changed Title!');
$em->flush();
$em->remove($p);
$em->flush();
DQL SQLشثی
Domain Modelتش اساس مذل
23
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT p FROM CEBlogBundle:Post p
WHERE p.rating > :rating ORDER BY p.title
ASC')->setParameter(‘rating', ‘2');
$posts = $query->getResult();
Query Object
24
$query->getSingleResult();
$query->setMaxResults(1);
->setParameter('title', 'The Title');
->setParameters([
'name' => 'Mohammad',
'title' => 'The Title',
]);
SELECT اشیاءاوتخاب
پاسامتشا
25
SELECT p FROM CEBlogBundle:Post p
WHERE p.title = "Post 1"
SELECT p FROM CEBlogBundle:Post p
WHERE p.title = :title
UPDATE
DELETE
26
UPDATE CEBlogBundle:Post p SET p.title =
CONCAT("OLD: ", p.title) WHERE p.id < 5
DELETE CEBlogBundle:Post p
WHERE p.id < 5
Repository یک وع اصاییک ومو ت
27
$repository = $this->getDoctrine()
->getRepository('CEBlogBundle:Post');
Repositoryتکمیل
28
repositoryClass:
CE\BlogBundle\Entity\PostRepository
class PostRepository extends EntityRepository
{
public function findOldPosts(){...}
}
$repository = $this->getDoctrine()
->getRepository('CEBlogBundle:Post');
$oldPosts = $repository -> findOldPosts();
reference اشیاءتیه اشیاء گشاف
کلیذ خاسجی
29
class Post
{
private $comments;
}
class Comment
{
private $post;
}
ساتط یک ت چىذ
30
#Post.orm.yml
oneToMany:
comments:
targetEntity:
CE\BlogBundle\Entity\Comment
mappedBy: comment
orderBy:
created_at: DESC
ساتط چىذ ت یک
31
#Comment.orm.yml
manyToOne:
post:
targetEntity: CE\BlogBundle\Entity\Post
inversedBy: comments
ا referenceکاس تا
32
$comment1 = new Comment();
$comment1->setPost($p);
$em->persist($comment1);
$comment2 = new Comment();
$p->addComment($comment2);
$em->persist($comment2);
ا referenceکاس تا
33
comment = $this->getDoctrine()
->getRepository('CEBlogBundle:Comment')
->find(5);
$postTitle = $comment->getPost()->getTitle();
Query Builder اQueryاتضاس کمکی تشای ساخته
34
$repository = $this->getDoctrine()
->getRepository('CEBlogBundle:Post');
$query = $repository->createQueryBuilder('p')
->where('p.name = :title')
->setParameter('title', 'The Title')
->orderBy('p.id', 'ASC')
->getQuery();
$posts = $query->getResult();
Queryدسیافت مته
پیچیذ ػملگش ای
35
$dql = $repository->createQueryBuilder('p')
->where('p.name = :title')
->setParameter('title', 'The Title')
->orderBy('p.id', 'ASC')
->getDQL();
->where($qb->expr()->orX(
$qb->expr()->eq('p.id', '5'),
$qb->expr()->like('p.title', 'Someth%')
((
JOIN
ي تاتغ ػملگشاتشتیة،
36
SELECT p FROM Post p JOIN p.user u
WHERE u.name = "Mohammad"
ORDER BY p.id ASC
p.id BETWEEN 5 AND 10
TRIM(p.title) = 'something'
p.id IN (1, 2)
SIZE(p.comments) > 1
Aggregateتاتغ
پاسخ ااواع Pure
Mixed
37
SELECT CEBlogBundle:Post p,
COUNT(p.comments) AS num_comments
Symfony Book, 2.2.
Doctrine ORM Documents, http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html.
Patterns of Enterprise Application Architectire, Martin Fowlel, Addison-Wesley, 2002.
38
Top Related