我正在创建一个十进制字段来为我的Symfony2应用程序保存Doctrine2中的财务数据.
目前,它看起来像这样:
/**
* @ORM\Column(type="decimal")
*/
protected $rate;
Run Code Online (Sandbox Code Playgroud)
当我输入一个值并且所述值持久保存到数据库时,它被舍入为整数.我猜我需要为该字段设置精度和比例类型,但我需要有人来解释他们究竟做了什么?
该Doctrine2文档说:
precision:十进制(精确数字)列的精度(仅适用于十进制列)
scale:十进制(精确数字)列的比例(仅适用于十进制列)
但这并没有告诉我太多.
我猜测精度是要舍入的小数位数,所以我假设应该是2,但是什么是比例?规模是重要数字吗?
我的现场宣言应该是这样吗?: -
/**
* @ORM\Column(type="decimal", precision=2, scale=4)
*/
protected $rate;
Run Code Online (Sandbox Code Playgroud) 我可以在使用延迟加载时从Doctrine 2中的arrayCollection中过滤出结果吗?例如,
// users = ArrayCollection with User entities containing an "active" property
$customer->users->filter('active' => TRUE)->first()
Run Code Online (Sandbox Code Playgroud)
我不清楚滤波器方法是如何实际使用的.
我有两个名为Category和Item的PHP模型类.类别可能包含许多项目,而项目可能属于许多类别.我已经为这两个类创建了ManyToMany关系:
class Category
{
/**
* @ORM\ManyToMany(targetEntity="Item", mappedBy="categories", cascade={"persist"})
*/
private $items;
/**
* Add items
*
* @param Ako\StoreBundle\Entity\Item $items
*/
public function addItems(\Ako\StoreBundle\Entity\Item $items)
{
$this->items[] = $items;
}
/**
* Get items
*
* @return Doctrine\Common\Collections\Collection
*/
public function getItems()
{
return $this->items;
}
}
Run Code Online (Sandbox Code Playgroud)
和:
class Item
{
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="items", cascade={"persist"})
* @ORM\JoinTable(name="item_category",
* joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")}
* )
*/
private $categories;
/**
* Add categories
*
* @param Ako\StoreBundle\Entity\Category $categories
*/ …
Run Code Online (Sandbox Code Playgroud) 我想从具有特定商品的所有订单中选择订单商品.在SQL中我会这样做:
SELECT DISTINCT i.id, i.name, order.name
FROM items i
JOIN orders o ON i.order_id=o.id
WHERE o.id IN (
SELECT o2.id FROM orders o2
JOIN items i2 ON i2.order_id=o2.id AND i2.id=5
)
AND i.id != 5
ORDER BY o.orderdate DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
如何使用查询构建器执行此查询?
欢迎任何想法/反馈:)
我遇到了如何在一个大型Symfony2应用程序中处理我的Doctrine2实体的业务逻辑的问题.(抱歉帖子长度)
在阅读了许多博客,食谱和其他资源后,我发现:
好吧,我完全同意它,但是: 在哪里以及如何处理域模型上复杂的业务规则?
我们的域名模型:
- 一个组可以使用角色
- a 角色可以由不同的组使用
- 一个用户可以属于多个组与许多角色,
在SQL持久层中,我们可以将这些关系建模为:
我们的具体业务规则:
- 仅当角色附加到组时,用户才能在组中拥有角色.
- 如果我们从组G1中分离角色R1,则必须删除具有组G1和角色R1的所有UserRoleAffectation
这是一个非常简单的例子,但我想知道管理这些业务规则的最佳方法.
1-服务层实现
使用特定的Service类:
class GroupRoleAffectionService {
function linkRoleToGroup ($role, $group)
{
//...
}
function unlinkRoleToGroup ($role, $group)
{
//business logic to find all invalid UserRoleAffectation with these role and …
Run Code Online (Sandbox Code Playgroud) 注意:如果我不想要的话,将接受"不可能"的答案
在关于继承映射的Doctrine 2文档中,它说有两种方法:
两者都有警告:
如果您将STI/CTI实体用作多对一或一对一实体,则不应将继承层次结构的较高级别的某个类用作"targetEntity",而只应使用没有子类的那些类.否则,Doctrine不能创建该实体的代理实例,并且总是急切地加载该实体.
那么,我如何继续使用与基类(抽象)类的关联继承?(并保持当然的表现)
用户有很多Pet
(抽象类扩展为Dog
或Cat
).
我想做的事 :
class User {
/**
* @var array(Pet) (array of Dog or Cat)
*/
private $pets;
}
Run Code Online (Sandbox Code Playgroud)
由于Doctrine文档中的警告,我应该这样做:
class User {
/**
* @var array(Dog)
*/
private $dogs;
/**
* @var array(Cat)
*/
private $cats;
}
Run Code Online (Sandbox Code Playgroud)
这很烦人,因为我放弃了继承的好处!
注意:我没有为映射到DB添加Doctrine注释,但您可以理解我的意思
我有Doctrine的实体:
<?php
/**
* @Entity
* @Table(name="orders")
*/
class Orders {
/** @Id @Column(name="OID",type="integer") @GeneratedValue */
private $id;
/** @Column(name="Product",type="string")*/
private $product;
/** @Column(name="RegCode",type="string")*/
private $reg_code;
/** @Column(name="OrderEmail",type="string")*/
private $email;
}
Run Code Online (Sandbox Code Playgroud)
我需要像这样进行查询:
select * from `orders` where `OrderEmail`='some@mail.com' and `Product` LIKE 'My Products%'
Run Code Online (Sandbox Code Playgroud)
我尝试处理查询没有像:
$em->getRepository("Orders")->findByEmailAndProduct($uname,$product);
Run Code Online (Sandbox Code Playgroud)
但它会犯错误.为什么?没有DQL我可以执行此查询吗?我想让这个查询使用魔术方法findBy**
我使用symfony和doctrine作为ORM,在可用类型中我有数组,simple_array或json_array 我想知道它们之间有什么区别?何时使用其中一个?你有每个展示案例来说明差异吗?
我已经在某些应用程序中使用了simple_array,但我发现它在formType中没有很好地呈现...(或者我可能没有使用它!?)
为了说明我的问题,这是一个展示案例:
我有一个任务,我必须在特定的一周运行所以我创建了具有days属性的TaskEntity
天就像那样:
$days = array(
1=>true,
2=>true,
3=>true,
4=>true,
5=>true,
6=>false,
7=>false
);
Run Code Online (Sandbox Code Playgroud)
但我不知道巫婆类型可供选择......
我还在学习Symfony2并且不了解如何上传文件.
别担心,我已经检查了文档.这真的很好,但我的问题没有在任何教程中解释.
我正在寻找有关如何使用Symfony2上传文件但有所有人需要的所有东西的指导(例如扩展的约束,基于id和东西重命名文件,在db中存储路径等等)
我找到了很好的教程,试图混合它们但没有成功.每次出现不同的问题:文件在表单上的每次提交时重新上传(即使文件字段为空),guessExtension也不可能使用,tmp路径存储在数据库而不是正确的路径,文件没有移动,不可能在重命名中使用了id,因为id是自动递增的,因此尚未生成).
所以,我会提出一个"标准"实体,比方说:Photo.php
/**
* Photo
*
* @ORM\Table(name="photo")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Photo
{
// Annotation for the id and auto increment etc
private $id;
/**
* @var string
* @Assert\File( maxSize = "3072k", mimeTypesMessage = "Please upload a valid Image")
* @ORM\Column(name="image", type="string", length=245, nullable=false)
*/
private $image
private $title
private $description
// all the function get, set for the 4 previous variables
}
Run Code Online (Sandbox Code Playgroud)
和控制器:
public function addPhotoAction()
{
$add_photo = new …
Run Code Online (Sandbox Code Playgroud) $ php app/console doctrine:query:dql'SELECT now()'
[Doctrine\ORM\Query\QueryException] [语法错误]第0行,第7行:错误:预期的已知函数,得到'现在'
如何在Doctrine DQL中使用MySQL now()函数?
doctrine-orm ×10
symfony ×6
php ×4
orm ×3
database ×2
mysql ×2
arrays ×1
doctrine ×1
dql ×1
file ×1
formbuilder ×1
inheritance ×1
lazy-loading ×1
many-to-many ×1
sql ×1
types ×1
upload ×1