我实际上陷入了三层结构.我浏览了互联网,发现了两个术语"数据库抽象层"和"数据访问层".
两者有什么不同?
我有一个用户实体:
use Doctrine\ORM\Mapping as ORM;
/**
* ExampleBundle\Entity\User
*
* @ORM\Entity()
*/
class User
{
// ...
/**
* @ORM\Column(type="service_expires_at", type="date", nullable=true)
*/
private $service_expires_at;
public function getServiceExpiresAt()
{
return $this->service_expires_at;
}
public function setServiceExpiresAt(\DateTime $service_expires_at)
{
$this->service_expires_at = $service_expires_at;
}
}
Run Code Online (Sandbox Code Playgroud)
当我将用户更新service_expires_at为以下内容时,更新后的service_expires_at值不会保存回数据库:
$date = $user->getServiceExpiresAt();
var_dump($date->format('Y-m-d')); // 2013-03-08
$date->modify('+10 days');
var_dump($date->format('Y-m-d')); // 2013-03-18
$user->setServiceExpiresAt($date);
$em->persist($user);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
但是,如果我传递一个新DateTime对象service_expires_at,则更新的值将正确保存:
$date = $user->getServiceExpiresAt();
$date->modify('+10 days');
$user->setServiceExpiresAt(new \DateTime($date->format('Y-m-d'));
$em->persist($user);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我怎样才能做到这一点:
例如,我有一个名为Issue的实体.我需要记录该实体字段的更改.
如果用户更改了Issue实体上的"status"字段,我需要与用户一起创建一个关于它的数据库记录,该用户更改了字段,以前的状态和新状态.
使用:Symfony2 + doctrine2.
我添加了一个自定义类型:
namespace My\SuperBundle\Types;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class Money extends Type
{
const MONEY = 'money';
public function getSqlDeclaration(
array $fieldDeclaration,
AbstractPlatform $platform
) {
return 'DECIMAL(10,2)';
}
public function getName()
{
return self::MONEY;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序启动:
namespace My\SuperBundle;
use Doctrine\DBAL\Types\Type;
use My\SuperBundle\Types\Money;
class MyBSuperBundle extends Bundle
{
public function boot()
{
//add custom quantity and wight types
$em = $this->container->get('doctrine.orm.entity_manager');
if(!Type::hasType(Money::MONEY)) {
Type::addType(Money::MONEY, 'My\SuperBundle\Types\Money');
}
}
}
Run Code Online (Sandbox Code Playgroud)
但每次我用以下内容更新数据库:
php app/console doctrine:schema:update --dump-sql
Run Code Online (Sandbox Code Playgroud)
我一直得到以下内容:
ALTER TABLE product_price CHANGE …Run Code Online (Sandbox Code Playgroud) 注意:这是在项目的问题跟踪器上报告的ORM限制
我正面临一个问题,即使用Doctrine 2.3中引入的实体类(层次结构的根)上的任意连接语法来构建DQL查询.
鉴于这些类:
A - 没有继承
B1 - 抽象,层次结构的根,鉴别器列被命名为'type'
我设置了一个这样的查询生成器:
$qb->select('a.id AS idA, b.id AS idB')
->from('\Entity\A', 'a')
->leftJoin('\Entity\B1', 'b', \Doctrine\ORM\Query\Expr\Join::WITH, 'a.something=b.something');
Run Code Online (Sandbox Code Playgroud)
SQL Doctrine生成的内容如下:
SELECT a.id, b.id FROM a LEFT JOIN b ON (a.something=b.something) WHERE b.type IN ('1', '2', '3')
Run Code Online (Sandbox Code Playgroud)
问题在于左边连接无用的地方.
有没有办法强制将鉴别器列上的条件放在连接中?至少那会使它......
我应该填写错误报告吗?
我已经设置了bjyoungblood/bjy-authorize模块,但是我正在403为每个URL 收到"访问被拒绝"错误,除了home路由中配置的那个.
我module.byjauthorize.global.php看起来如下:
'bjyauthorize' => array(
'guards' => array(
'BjyAuthorize\Guard\Controller' => array(
array('controller' => 'index', 'action' => 'index', 'roles' => array('guest','user')),
array('controller' => 'index', 'action' => 'stuff', 'roles' => array('user')),
array('controller' => 'zfcuser', 'roles' => array()),
//backend
array('controller' => 'Application\Controller\Index', 'roles' => array('admin')),
array('controller' => 'MyModule\MyEntity\MyEntity', 'roles' => array('admin')),
),
'BjyAuthorize\Guard\Route' => array(
array('route' => 'zfcuser', 'roles' => array('user')),
array('route' => 'zfcuser/logout', 'roles' => array('user')),
array('route' => 'zfcuser/login', 'roles' => array('guest')),
array('route' …Run Code Online (Sandbox Code Playgroud) 我用symfony2和doctrine用命令反向设计我的数据库:
php app/console doctrine:mapping:convert
php app/console doctrine:mapping:import
php app/console doctrine:generate:entities
Run Code Online (Sandbox Code Playgroud)
但我的字段被映射为布尔值而不是tinyint(2).
为什么它映射为布尔值?
拥有QueryBuilder结果
$query = $em->createQuery("SELECT....");
Run Code Online (Sandbox Code Playgroud)
通过iterate()方法获取它们
http://doctrine-orm.readthedocs.org/en/2.0.x/reference/batch-processing.html
$objects = $query->iterate();
Run Code Online (Sandbox Code Playgroud)
我现在能够
foreach ($objects as $object) {
$object = $object[0];
//do something..
$object->getObjectId();
...
}
Run Code Online (Sandbox Code Playgroud)
但...
//after the iterate() call, before to foreach
echo sizeof($objects); //or count($objects);
//always "1", even if i have 10000 foreach loops
Run Code Online (Sandbox Code Playgroud)
为什么以及如何修复?
我正在尝试使用Zend Framework 1.7.4上传文件,但尚未成功.我已经阅读过Akrabat的教程,这很有帮助但是当我在我的项目中使用这些技术时,我无法让它工作.
我正在寻找有关如何映射使用联接表的OneToMany / ManyToOne关系的建议。我没有进行映射,并且收到错误消息,未在媒体表中设置article_id。
class Media
{
// ...
/**
* @ManyToOne(targetEntity="Document", inversedBy="media")
* @JoinTable(name="articles_x_media", referencedColumnName="id")
* joinColumns={@JoinColumn(name="media_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="bid_id", referencedColumnName="id")})
* )
*/
protected $document;
}
class Document
{
// ...
/**
* @OneToMany(targetEntity="Media", mappedBy="document"))
* @JoinTable(name="articles_x_media", referencedColumnName="id")
* joinColumns={@JoinColumn(name="article_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="media_id", referencedColumnName="id")}
* )
*/
protected $media;
}
Run Code Online (Sandbox Code Playgroud) doctrine-orm ×6
doctrine ×3
php ×3
symfony ×3
dbal ×2
3-tier ×1
bjyauthorize ×1
file-upload ×1
oop ×1
tinyint ×1
zend-form ×1