数据库和Doctrine(转载自http://www.111cn.net/phper/332/85987.htm)

经把数据库信息分别到一个一定的文书中,你可死爱的啊每个服务器保存不同之版。你啊堪在路外轻松存储数据库配置(一些快信息),就比如apache配置一样。更多信息请参考How
to Set external Parameters in the Service Container.
本Doctrine知道你的数据库配置了,你得为此其来创造一个数据库了。

3、Docker libnetwork 设计文档

当您需要得到相关的靶子时,你的办事流跟以前一样。首先取得$product对象,然后访问它的系Category

 7、kubernetes networking design document

设置数据库也UTF8
就算于经验丰富的程序员来说,一个常犯的谬误是,在Symfony项目起后,忘记设置他们的多寡库默认字符集和校规则,仅把大部分数据库被起之latin类型的校作为默认。他们或者在第一破操作时见面记得,但至了后面敲起点滴实施相关的正规命令下,就完全忘记了。

1、Why kubernetes not doesn’t use libnetwork

// src/AppBundle/Entity/Product.php

// ...
class Product
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;
}

http://blog.kubernetes.io/2016/01/why-Kubernetes-doesnt-use-libnetwork.html

public function showAction($id)
{
    $product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->findOneByIdJoinedToCategory($id);

    $category = $product->getCategory();

    // ...
}

10、Network Plugins

$em->remove($product);
$em->flush();

 

欠令可以管Product类所有的getter和setter都受扭转。这是一个康宁之通令执行,你可以频繁运转它们,它仅会转移那些未设有的getters和setters,而非见面交替已有的。

8、kubernetes官方文档:Networking in Kubernetes

免轻使QueryBuilder,你还可一直使用DQL查询:

https://docs.docker.com/engine/userguide/networking/get-started-overlay/

// src/AppBundle/Controller/DefaultController.php

// ...
use AppBundle\Entity\Product;
use Symfony\Component\HttpFoundation\Response;

// ...
public function createAction()
{
    $product = new Product();
    $product->setName('A Foo Bar');
    $product->setPrice('19.99');
    $product->setDescription('Lorem ipsum dolor');

    $em = $this->getDoctrine()->getManager();

    $em->persist($product);
    $em->flush();

    return new Response('Created product id '.$product->getId());
}

4、Docker network 官方文档

$ php app/console doctrine:database:create

11、Flannel 安装

代码中__construct()方法十分重要,因为Doctrine需要$products属性成为一个ArrayCollection对象,它同数组非常相近,但会活一些。如果立即叫您感觉不好受,不用顾虑。试想他是一个勤组,你见面欣然接受它。
方注释所用之targetEntity
的价好应用合法的命名空间引用任何实体,而不仅仅是概念在跟一个类吃的实业。
如果只要提到一个定义在不同的近乎还是bundle中之实业则需要输入了的命名空间作为对象实体。
搭下去,因为每个Product类可以提到一个Category对象,所有添加一个$category属性到Product类:

http://dockone.io/article/618

// ...

use AppBundle\Entity\Category;
use AppBundle\Entity\Product;
use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller
{
    public function createProductAction()
    {
        $category = new Category();
        $category->setName('Main Products');

        $product = new Product();
        $product->setName('Foo');
        $product->setPrice(19.99);
        $product->setDescription('Lorem ipsum dolor');
        // relate this product to the category
        $product->setCategory($category);

        $em = $this->getDoctrine()->getManager();
        $em->persist($category);
        $em->persist($product);
        $em->flush();

        return new Response(
            'Created product id: '.$product->getId()
            .' and category id: '.$category->getId()
        );
    }
}

12、Docker Networking Internals: How Docker uses Linux iptables and
interfaces

拖欠DQL语法强大到叫人怀疑,允许而轻松地以里面投入实体(稍后会介绍涉)、组等。更多信息请参考Doctrine
Query Language文档。

6、理解Docker单机容器网络

创新目标
如你自Doctrine中取得了一个目标,那么更新她就变得生轻了。假设你产生一个路由映射一个产品id到一个controller的updateaction。

https://kubernetes.io/docs/admin/network-plugins/

public function showAction($id)
{
    $product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($id);

    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }

    // ... do something, like pass the $product object into a template
}

https://github.com/kubernetes/community/blob/master/contributors/design-proposals/networking.md

而啊得翻Doctrine官方文档Basic Mapping
Documentation关于映射信息的装有细节。如果你采取annotations,你要有所的诠释都来ORM(例如
ORM\Column()),这些doctrine模板并从未。你还需要去引入use
Doctrine\ORM\Mapping as ORM;声明,它是用来推荐ORM注册前缀的。
小心你的类名和总体性很可能就是被射到一个叫保障的SQL字段(如group和user)。举例,如果您的entity类名称为Group,那么,在默认情
况下,你的表名为group,在部分发动机中或许导致SQL错误。请查看 Reserved SQL
keywords
documentation,他会见报告你怎么样是的避让这些号。另外,你可以任意简单的照耀到不同的表名和配段名,来挑选而的数据库纲要。请查看
Doctrine的Persistent classes和Property Mapping文档。
当以外的库或者程序(例如
Doxygen)它们利用了诠释,你应该拿@IgnoreAnnotation注释添加至此类上来告诉Symfony忽略它们。
照我们若阻止@fn 声明抛来很,可以这样:

http://securitynik.blogspot.com/2016/12/docker-networking-internals-how-docker\_16.html

$ php app/console doctrine:schema:update --force

https://docs.docker.com/engine/userguide/networking/get-started-overlay/

兹您虽得于公的controller中一次性查询一个成品对象及其涉及的category对象信息了。

2、Docker:Multi-host networking

重大之是您死爱的看到了product的系category对象。但是category的数据并无见面被获取下要直到你请category的时。这即是推加载。

https://docs.docker.com/engine/userguide/networking/

 当然,你为堪行使复杂的查询,想询问又多要阅读Querying for Objects 。
若也可使得使用findBy和findOneBy方法的优势,很轻之冲多单标准来得到对象。

https://github.com/docker/libnetwork/blob/master/docs/design.md

假定定义repository类,首先用在公的炫耀定义着补充加repository类的扬言:

https://kubernetes.io/docs/admin/networking/

Category类中$product属性的初数据配置不是专程重要性,它仅是告Doctrine去寻觅Product.category属性来测算产生涉嫌映射是什么。

9、Four ways to connect a docker container to a local network

15履行得doctrine实体管理对象,这是负处理数据库持久化过程及读取对象的。

http://tonybai.com/2016/01/15/understanding-container-networking-on-single-host/

Doctrine字段类型参考
Doctrine配备了汪洋可用的字段类型。它们每一个都能映射PHP数据类型到一定的列类型,无论你用啊数据库。对于各一个字段类型,Column
都好于愈来愈部署,可以设置length,
nullable行为,name或者其它安排。想查看更多信息请参考Doctrine的Mapping
Types documentation。

http://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/ 

创造一个实体类

5、Docker multihost network 官方文档

询问对象

实际上,Doctrine了解你拥有的吃管制之实业,当您调用flush()方法时,它会精打细算起有的变化,并推行太实用的查询可能。
他运用准备好的复苏存略微提高性能。比如,你一旦持久化总是为100的制品对象,然后调用flush()方法。Doctrine会创建一个唯一的备选语句并重
复使用它插入。
于开创和更新目标时,工作流是同一之。在产一样节中,如果记录就是数据库中,您将看到Doctrine如何聪明的活动发出一个Update语句。

public function showAction($id)
{
    $product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($id);

    $categoryName = $product->getCategory()->getName();

    // ...
}

Doctrine允许你用同一栽更加有意思之方法对数据库进行操作,而非是独自是得基于列表的行到数组中。Doctrine允许你保存整个对象到数据库或者将目标由数据库中取出。这些还是通过映射PHP类到一个数码库表,PHP类的属性对应数据库表的列来实现的。

 说真的,这漫漫命令是特殊之强有力。它会基于你的entities的照信息,来比现在底数据库,并生成所急需之新数据库的更新SQl语句。换句话说,如
果你想补充加一个新的特性映射元数据到Product并运行该任务,它以老成一个alert
table 语句来上加新的列到已经在的product表中。
一个又好的发表这等同优势的功用是由此migrations,它同意你十分成这些SQL语句。并蕴藏到一个搬移类,并能够起团体的运转于您的产条件受到,系统为安全可靠地跟以及迁移数据库。
今天您的数据库被来矣一个清一色效的product表,它的每个列都会让射到您指定的状元数据。

请求记住,你可以经过网页调试工具查看请求的富有查询。
自然,如果你想同一次于造访片只目标,你得经过一个join连接来避免二差询问。把下部的艺术上加到ProductRepository类中:

而也可于任何方向拓展查询:

$product = $this->getDoctrine()
    ->getRepository('AppBundle:Product')
    ->find($id);

$category = $product->getCategory();

// prints "Proxies\AppBundleEntityCategoryProxy"
echo get_class($category);
$ php app/console doctrine:generate:entities AppBundle

自定义Repository类

当,Doctrine 也允许你用Doctrine Query
Language(DQL)写一些犬牙交错的查询,DQL类似于SQL,只是其用来查询一个或者基本上个实体类的对象,而SQL则是查询一个数据库表中的履。

 将安排信息定义及parameters.yml仅仅是一个惯例。定义在该文件中之配备信息将会让主配置文件在设置Doctrine时引用。

$product = $query->getOneOrNullResult();
annotations:


// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;

    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    protected $price;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;
}
# app/config/config.yml
doctrine:
    dbal:
        driver: pdo_sqlite
        path: "%kernel.root_dir%/sqlite.db"
        charset: UTF8

波及以及代理类

若果您想演示这个案例,你需要去创造一个路由指向这action,让他干活。
正文展示了当控制器中使用Doctrine的getDoctrine()方法。这个措施是得到doctrine服务最便捷的方。你能于劳务中之别其他地方以doctrine注入该服务。更多关于大自己之服务信息,请参见Service
Container。
当省前面例子的详情:

$repository = $this->getDoctrine()
    ->getRepository('AppBundle:Product');

$query = $repository->createQueryBuilder('p')
    ->where('p.price > :price')
    ->setParameter('price', '19.99')
    ->orderBy('p.price', 'ASC')
    ->getQuery();

$products = $query->getResult();

图片 1

关于doctrine:generate:entities命令
就此其而得生成getters和setters。
所以它们以部署@ORM\Entity(repositoryClass=”…”)声明的情状下,生成repository类。
故此其可啊1:n或者n:m生成适量的构造器。
该命令会保存一个本Product.php文件之备份Product.php~。
有些时候只是为能够会促成“不能够再次声明类”错误,你得放心的删除其,来排错误。您还足以使用–no-backup选项,来防护发生这些配置文件。
自你无必要借助让该命令行,Doctrine不依赖于代码生成,像正规的PHP类,你不过待确保她的protected/private属性拥有getter和setter方法即可。主要出于用命令行去创建是,一种常见事。
你啊得吧一个bundle或者全部实体命名空间内之有着都解实体(任何含Doctrine映射声明的PHP类)来生成getter和setter:

生命周期回调和波监听
顾到setCreatedValue()方法不需吸收任何参数。这是生命周期回调通常的做法及老:生命周期回调应该是略方法,更关爱于实体内部传输数据。比如设置一个创造/更新字段,生成一个定量值等。
若果你要有些比特别之行活动,像执行日志或者发送邮件,你当登记一个恢弘类作为事件监听器或接收器给它给访问所待资源的权。想了解又多,请参见How
to Register Event Listeners and Subscribers.
 

如此这般的接近时吃喻为“Entity”,意味着一个基础类保存数据。它们简单来满足你应用程序的工作要。不过本它还未能够叫保存到数据库中,因为今她只不过还是独大概的PHP类。

 

下一场经过运行与之前生成丢失的getter和setter方法同样的命令执行,Doctrine会为你自动生成repository类。

于地方你已经开于controller中创造同运负责的查询了。为了隔离,测试与选定这些查询,一个吓的方法是吗您的实业创建一个自定义的repository类并累加相关逻辑查询方式。

“延迟加载”成为可能,是盖Doctrine返回一个摄对象来替真正的对象:

在意调用 $em->persist($product)
在此间没有必要。我们回想一下,调用该办法的目的关键是报Doctrine来保管或“观察”$product对象。在这边,因为您既落到了$product对象了,说明已经为管制了。

$ php app/console doctrine:generate:entities AppBundle/Entity/Product

当用一个自定义的repository类时,你依旧可拜原本的默认查找方法,比如find()
和findAll()等。

  对于任何应用程序来说最广泛不过具有挑战性的天职,就是打数据库中
读取和持久化数据信息。尽管symfony完整的框架没有默认集成ORM,但是symfony标准版,集成了过多主次,还于带集成了Doctrine这样
一个仓库,主要的目的是受开发者一个强硬的工具,让您办事起更爱。在本章,你晤面学会doctrine的主干见解而会了解哪些轻松使用数据库。

生产Getters和Setters
尽管Doctrine现在知晓了怎样持久化Product对象到数据库,但是类本身是休是发生因此吗。因为Product仅仅是一个正规的PHP类,你得创
建getter和setter方法(比如getName(),setName())来走访它的属性(因为她的性能是protected),幸运的凡
Doctrine可以吧咱做这些:

// src/AppBundle/Entity/Product.php

/**
 * @ORM\PrePersist
 */
public function setCreatedAtValue()
{
    $this->createdAt = new \DateTime();
}

去对象

苟您想要利用SQLite作为数据库,你需要装path为汝的数据库路径

咱俩先不扣Doctrine的头条数据,你本有零星单近乎Category和Product,并且具有一个一对准大多之涉。该Category类包含一个
数组Product对象,Product包含一个Category对象。换句话说,你都创造了公所急需之切近了。事实上把这些需要之多少持久化到数据库上
是从的。

public function showProductsAction($id)
{
    $category = $this->getDoctrine()
        ->getRepository('AppBundle:Category')
        ->find($id);

    $products = $category->getProducts();

    // ...
}

假使你创造一个应用程序,其中多少产品要出示。即时不考虑Doctrine或者数据库,你吗理应明了您用一个Product对象来表现这些活。在公的AppBundle的Entity目录下开创一个好像。

先是,由于一个Category对象将涉及到大半只Product对象,一个products数组属性被补充加到Category类保存这些
Product对象。其次,这不是因Doctrine需要它,而是因在应用程序中呢每一个Category来保存一个Product数组非常实惠。

// src/AppBundle/Entity/ProductRepository.php
namespace AppBundle\Entity;

use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository
{
    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT p FROM AppBundle:Product p ORDER BY p.name ASC'
            )
            ->getResult();
    }
}
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
    'SELECT p
    FROM AppBundle:Product p
    WHERE p.price > :price
    ORDER BY p.price ASC'
)->setParameter('price', '19.99');

$products = $query->getResult();

再次多Doctrine’s Query Builder的音讯请看Query Builder。
 

  Doctrine可以了剥离symfony使用,并且在symfony中是否采取呢是可选的。本章主要了解Doctrine的ORM,其目的是深受你的对准
象映射到数据库中(如MySQL, PostgreSQL和Microsoft
SQL)。如果你爱使用初的数据库查询,这很易,可以了解cookbook
中的”How to Use Doctrine DBAL“。
若呢足以以Doctrine
ODM库将数据持久化到MongoDB。更多信息请参考”DoctrineMongoDBBundle“。

交现行了却,我们加加了少单新特性到Category和Product类。现在报告Doctrine来为她生成getter和setter方法。

打数据库中获取对象又易于,举个例证,假如你安排了一个路由来,用其的ID显示特定的product。

于这事例中,你首先冲产品id查询一个Product对象。他就查询产品数量并将多少让$product对象。接下来,当你调
用$product->getCategory()->getName()
时,Doctrine默默的也汝行了次不成查询,查找一个以及拖欠产品有关的category,它挺成一个$category对象回来给你。

// query for one product matching by name and price
$product = $repository->findOneBy(
    array('name' => 'foo', 'price' => 19.99)
);

// query for all products matching the name, ordered by price
$products = $repository->findBy(
    array('name' => 'foo'),
    array('price' => 'ASC')
);

若是你习惯了描写SQL,那么对DQL也应有无会见倍感陌生。它们中最特别的两样就是您要思想对象,而无是数据库表行。正为这样,所以你于AppBundle:Product选择并吃它定义别名p。(你看与方面就的结果同样)。

得相关对象

/**
 * @IgnoreAnnotation("fn")
 */
class Product
// ...

提到Category和Product两单实体,首先以Category类中创造一个products属性:

$repository->find($id);

$repository->findOneByName('Foo');
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;

class Product
{
    protected $name;
    protected $price;
    protected $description;
}

脚,添加一个初点子findAllOrderedByName()
到新生成的repository类。该法以查询所有的Product实体,并按照字符顺序排序。

[mysqld]
# Version 5.5.3 introduced “utf8mb4”, which is recommended
collation-server     = utf8mb4_general_ci # Replaces
utf8_general_ci
character-set-server = utf8mb4            # Replaces utf8
咱推荐避免用Mysql的uft8字符集,因为她并无配合4-byte
unicode字符,如果字符串中有这种字符会被清空。不过这种状态给修复了,参考《新型utf8mb4字符集》

生命周期回调
偶你可能得以一个实体被创造,更新或者去除的内外执行有操作。这些操作方法处在一个实体不同的生命周期阶段,所以这些行为为称呼”生命周期回调“。

当您错过渲染页面,你可以当网页调试工具的右下角看到许多之询问。
doctrine_web_debug_toolbar
而你单机该图标,分析页面将开辟,显示你的标准查询。
使你的页面查询过了50只她会成黄色。这或表明你的顺序来题目。

$repository = $this->getDoctrine()
    ->getRepository('AppBundle:Product');

如今您可告知Doctrine在其它可用的生命周期事件上执行一个智了。比如,假而你想当一个新的实体第一不善吃创造时设置创建日期列(created)为眼前日期。

# generates all entities in the AppBundle
$ php app/console doctrine:generate:entities AppBundle

# generates all entities of bundles in the Acme namespace
$ php app/console doctrine:generate:entities Acme

图片 2

当公真开始之前,你得配置你的数据库链接信息。按照常规,这些信日常配置当app/config/parameters.yml文件中:

每当这种气象下,同样的政工闹了。你首先查看一个category对象,然后Doctrine制造了亚破询问来取与之相互关联的保有Product对
象。只有当公调用->getProducts()时才见面实行同样不好。
$products变量是一个经其的category_id的值跟给定的category对象相关联的持有Product对象的集合。

Doctrine提供了一个类库允许你通过编程,加载测试数据及你的档次。该类库为
DoctrineFixturesBundle(http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html)

今,一个独门的行被添加到category和product表中。新产品的product.categroy_id列被设置为新category表中的id的价值。Doctrine会为汝管理这些持久化关系。

纪事setParameter()方法。当Doctrine工作时,外部的价,会通过“占位符”(上面例子的:price)传入,来防范SQL注入攻击。
欠getResult()方法返回一个结果往往组。想要博取一个结实,你可利用getSingleResult()(这个办法以无结果时见面扔来一个颇)或者getOneOrNullResult():

拖欠令行为您怪成一个Category实体,包含id字段和name字段以及有关的getter和setter方法。

// src/AppBundle/Entity/Category.php

// ...
use Doctrine\Common\Collections\ArrayCollection;

class Category
{
    // ...

    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    protected $products;

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }
}

你已经观望了repository对象允许你尽有主导的询问而不待而开其他的工作。

$ php app/console doctrine:schema:update --force

假设你用annotations方式,开启一个生命周期回调,需要如下设置:(如果您不爱您为堪运用yaml和xml方式)

缔造数量库表和模式
今昔我们发出矣一个可用之Product类和她的映射信息,所以Doctrine知道怎么样持久化它。当然,现在Product还并未对号入座的product数据库表在数据库被。幸运的是,Doctrine可以活动创建有的多寡库表。

1.打Doctrine取出对象
2.窜对象
3.当实体管理者上调用flush()方法

$ php app/console doctrine:generate:entity

一旦您上了Doctrine背后之概念,你可吃Doctrine来为而创造实体类。他见面咨询您有些题材来创造entity:

$em = $this->getDoctrine()->getManager();
$products = $em->getRepository('AppBundle:Product')
    ->findAllOrderedByName();

join相关记录
每当之前的我们的查询中,会发出两糟糕询问操作,一蹩脚是获得原对象,一涂鸦是赢得涉及对象。

本,让咱们来探望在Product类中为$category配置的头数据。它报告Doctrine关系类是Category并且它需要保留
category的id到product表的category_id字段。换句话说,相关的归类目标将见面吃保存到$category属性中,但是于底
层,Doctrine会通过囤category的id值到product表的category_id列持久化它们的干。

实业的涉嫌/关联
一旦你应用程序中的出品属一确定的归类。这时你用一个分类目标与一致栽将Product和Category对象关系在齐的道。首先我们创建Category实体,我们最终使通过Doctrine来针对其开展持久化,所以我们这里为Doctrine来助咱创建是近乎。

用Doctrine’s Query Builder查询对象
假设你想询问产品,需要回到价格高于19.99底成品,并且要求本价格从低到强排列。你得下Doctrine的QueryBuilder:

产生矣Doctrine,你可集中精力到公的靶子及哪些将它们采取被你的应用程序中,而毋庸担心数据库持久化。因为Doctrine允许而采取其它的PHP对象保存你的数目并因映射元数据信息来维系一个靶到特定的数额库表。

拖欠代理对象继承了Category对象,从表面到作为都颇像category对象。所不同的凡,通过是代理对象,Doctrine可以缓查询真正的Category对象数据,直到真正用她时时(调用$category->getName())。
Doctrine生成了代理对象并把她存储到cache目录中,尽管你恐怕从不曾意识了它们。记住它们立刻同碰老要紧。
咱们得透过join连接来一次性取出product和category数据。这时Doctrine将见面回到真正的Category对象,因为未欲延期加载。

———————————————新建数据库及时段还未若直接以mysql里面操作更有益于———————————————–

自从数据库被收获对象

现深受咱们来看看Controller内的代码如何处理:

动DQL查询对象

# app/config/parameters.yml
parameters:
    database_driver:    pdo_mysql
    database_host:      localhost
    database_name:      test_project
    database_user:      root
    database_password:  password

# ...

Doctrine不关心而的性能是protected还是private,或者这些性是否发getter或setter。之所以生成这些getter或者setter完全是盖您待以及你的PHP对象进行交流用它。
 

地方的例子假要你曾经创办了createdAt属性(为以此显示)。
今天于实业第一次让保留时,Doctrine会自动调用这个法而created日期自动装也当前日期。

因为Doctrine能够开这些,所以您不过只是需要创造一个meatdata,或者安排告诉Doctrine的Product类和她的属性应该如何映射到数据库。这些metadata可以于定义成各种格式,包括YAML,XML或者通过声明直接定义及Product类中。

使你用注释,你得先在拥有注释加ORM\(如ORM\OneToMany),这些当doctrine官方文档里没。你还待声明use
Doctrine\ORM\Mapping as ORM;才能够运用annotations的ORM。

$ php app/console doctrine:generate:entities AppBundle

持久化对象及数据库
现今我们有了一个Product实体和与之映射的product数据库表。你可以把数量持久化到数据库里。在Controller内,它非常简单。添加下的法门及bundle的DefaultController中。

 

再有一些其它的生命周期事件,你可以动用其。更多生命周期事件以及生命周期回调,请查看Doctrine的Lifecycle
Events documentation。

 在Repository类中得经$this->getEntityManager()方法类获取entity管理。
而就是可以像用默认的法子一致采用这新定义的办法了:

一个简易的事例:一个活
摸底Doctrine是什么工作的最为简便易行的方尽管是圈一个实际上的使。在本章,你待配置你的数据库,创建一个Product对象,持久化它到数据库并且将它们抓到手回来。

伸手牢记doctrine
entity引擎生产简单的getters/setters。你应该检查生成的实业,调整getter/setter逻辑为协调想如果的。

保留有关实业

以本节10-13行,你实例化$product对象,就如其他任何一般的php对象同。

 

16履行persist()方法告诉Doctrine去“管理”这个$product对象。还不曾在数据库被运用过话。

安排数据库

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Product
{
    // ...
}

 添加映射信息

重多涉及信息
本节着就介绍了一个日常的实体关联,一针对性多关系。对于再次高级的关系和什么采取另外的涉(例如
一对一,多对平),请参见 doctrine 的Association Mapping Documentation.

去除一个对象,需要从实体管理者那里调用remove()方法。

// query by the primary key (usually "id")
$product = $repository->find($id);

// dynamic method names to find based on a column value
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');

// find *all* products
$products = $repository->findAll();

// find a group of products based on an arbitrary column value
$products = $repository->findByPrice(19.99);

图片 3

适使您想的那样,remove()方法告诉Doctrine你想打数据库中移除指定的实体。真正的勾查询没有为真正的执行,直到flush()方法给调用。

汝得下@ParamConverter注释不用编写任何代码就得兑现均等的力量。更多信息要查看FrameworkExtraBundle文档。
当您询问有特定的成品常常,你连用动用她的”respository”。你可当Respository是一个PHP类,它的唯一工作就是扶您于某特定类哪里得到实体。你可吧一个实体对象看一个repository对象,如下:

每当Doctrinez中询问时,你产生半点种植选择:写纯Doctrine查询 或者
使用Doctrine的查询创建器。

配置
Doctrine是高度可部署的,但是你也许永远不要关心他们。要惦记打听再多关于Doctrine的布信息,请查看config
reference。

提到映射

以连续之前,一定要报Doctrine添加一个新的category表和product.category_id列以及新的外键。

$ php app/console doctrine:database:drop –force
$ php app/console doctrine:database:create
以Doctrine里一直着默认字符集是免容许的,因为doctrine会根据条件布置,尽可能多地失去适应各种“不可知”情形。解决办法之一,是去安排“服务器级别”的默认信息。
安装UTF8为MySql的默认字符集是非常简单的,只要在数据库配置文件中加几行代码就可了(一般是my.cnf文件)

$ php app/console doctrine:generate:entity \
    --entity="AppBundle:Category" \
    --fields="name:string(255)"

内appBundle:Product是简单写法,你可于Doctrine中任意使用其来代替实体类的全限定称号(例如AppBundle\Entity\Product)。只要您的entity在你的bundle的Entity命名空间下其就会做事。你只要发生矣Repository,你就算足以拜该颇具分类的辅方法了。

17实行党之flush()方法让调用,Doctrine会查看她管理的富有目标,是否要吃持久化到数据库。在照例子中,这个$product对象还从未持久化,所以这个entity管理即会见履一个insert语句以会当product表中创造一行数。

# app/config/config.yml
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
 */
class Product
{
    //...
}

一个bundle只堪承受平等种metadata定义格式。比如,不可知拿YAML定义之metadata和声明PHP实体类一起混用。
表名是可选的,如果简单,将基于entity类的名称自动确定。
Doctrine允许你错过挑各种不同之字段类型,每个字段都起温馨的布置。有关字段类型信息,请看Doctrine
Field Types Reference。

 

创新一个目标包括三步:

总结

public function updateAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $product = $em->getRepository('AppBundle:Product')->find($id);

    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }

    $product->setName('New product name!');
    $em->flush();

    return $this->redirectToRoute('homepage');
}
// src/AppBundle/Entity/ProductRepository.php
public function findOneByIdJoinedToCategory($id)
{
    $query = $this->getEntityManager()
        ->createQuery(
            'SELECT p, c FROM AppBundle:Product p
            JOIN p.category c
            WHERE p.id = :id'
        )->setParameter('id', $id);

    try {
        return $query->getSingleResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

QueryBuilder对象涵盖了创建查询的拥有必须的法门。通过调用getQuery()方法,查询创建器将回一个规范的Query对象。它和我们直接写查询对象效果同样。

尽管Doctrine围绕在一个简单的定义发展要来,但是她不可思议的强硬。允许你创造复杂的询问以及订阅事件,通过订阅事件而得在一切持久化过程中实施有异之一言一行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注