我为Doctrine DQL创建了自定义DQL函数:
class Translate extends FunctionNode {
public $field;
public function getSql(SqlWalker $sqlWalker) {
$query = "TRANSLATE(" . $this->field->dispatch($sqlWalker) . ", 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY')";
return $query;
}
public function parse(Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->field = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Run Code Online (Sandbox Code Playgroud)
它在使用时似乎运行良好.
但是如果字符串参数包含超过307个字符,则它不起作用.没有错误,但脚本正在结束.
$query = $this->createQueryBuilder('...');
$query->addSelect("TRANSLATE('less than 307 chars')"); // working
$query->addSelect("TRANSLATE('more than 307 chars')"); // NOT working
Run Code Online (Sandbox Code Playgroud)
我如何使用超过307个字符?
我有这样的实体:
/**
*
* @Table(name="table")
* @Entity
*/
class Table {
/**
* @Column(type="integer")
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ManyToOne(targetEntity="Entities\Users")
* @joinColumn(name="userId", referencedColumnName="id")
*/
private $User;
/**
* @Column(type="string")
*/
private $text;
}
Run Code Online (Sandbox Code Playgroud)
如果我做
$q->getQuery()->getSingleResult()->getUser()->getUserId()
doctrine生成查询,如:
SELECT * FROM table t INNER JOIN users u ON u.id = t.userId WHERE id = 100
Run Code Online (Sandbox Code Playgroud)
但如果我不需要表用户,如何获得userId.
在纯SQL中,我可以
SELECT * FROM table WHERE id = 100
Run Code Online (Sandbox Code Playgroud)
并获取没有join users表的userId.
在同一个实体中,我有一个PreUpdate和一个PrePersist.触发PreUpdate,但PrePersist永远不会发生.我die()在生命周期回调中放了一个flush和注释.完整的实体可以在http://pastebin.com/yUk1u4GQ上看到
实体回调
/**
* @PreUpdate
*/
public function fixDates(){
$this->updatedOn = $this->getNow();
$this->closedDate = null;
$this->openDate = null;
print "dates fixed";
}
/**
* @PrePersist
*/
public function prePersist() {
print 'in prePersist';
die();
}
Run Code Online (Sandbox Code Playgroud)
实体经理致电
$em->persist($school);
$em->flush();
die();
Run Code Online (Sandbox Code Playgroud)
我的屏幕显示"已修复日期",但不是prePersist消息.我确实拥有@HasLifecycleCallbacks该实体的顶部.
我正在制作一个活动网站,并且在制作和表演之间有一对多的关系,当我有一个表演对象时,如果我需要它的制作ID,那么我必须做的事情
$productionId = $performance->getProduction()->getId();
Run Code Online (Sandbox Code Playgroud)
在我确实只需要生产ID的情况下,发送另一个数据库查询来获取已经存在于某个对象中的值似乎是浪费.这有什么方法吗?
我与多对多的关系遇到了一些麻烦.我有Users和Assets.我希望能够将用户分配到资产页面上的资产.
下面的代码显示创建/编辑资产时的用户列表,但是对用户复选框所做的更改不会保存,而其余数据会保留.
如果我通过mysql客户端向users_assets添加条目,则这些更改将显示在资产列表中.
用户
class User extends BaseUser
{
/**
* @ORM\ManyToMany(targetEntity="Asset", inversedBy="users")
*/
private $assets;
}
Run Code Online (Sandbox Code Playgroud)
财富
class Asset
{
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="assets")
*/
private $users;
}
Run Code Online (Sandbox Code Playgroud)
AssetType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$form = $builder
->add('users', null, array(
'expanded' => true,
'multiple' => true
))
->getForm();
return $form;
}
Run Code Online (Sandbox Code Playgroud) 如何在Doctrine 2中设置具有额外列的连接表,或与其他属性的多对多关联?
在我成功创建了TaskBundle并在类别和任务之间建立了一对多关系后,现在我正在尝试创建一个具有多对多关系的新TaskBundle.我在这个关系中检查复选框也有问题,但现在它不是主要问题(也许在解决之后).我删除了所有表,这是TaskBundle使用并尝试创建一个新的,但这里有问题(底部的描述).
我的任务对象:
<?php
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="tasks")
*/
class Task
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=200)
* @Assert\NotBlank(
* message = "Task is empty"
* )
* @Assert\Length(
* min = "3",
* minMessage = "Task is too short"
* )
*/
protected $task;
/**
* @ORM\Column(type="datetime")
* @Assert\NotBlank()
* @Assert\Type("\DateTime")
*/
protected $dueDate;
/**
* @Assert\True(message = "You have …Run Code Online (Sandbox Code Playgroud) 在Google上尝试了很多howto后,我仍然没有答案.
我想从具有最高ID(ai)的数据库中获取对象.我知道这一定很简单,但我找不到解决办法.
在数据库中,我有实体Syncs,它们具有自动增量ID.我需要那个(最新的)对象来检索一个DateTime的值.
(顺便说一句,它是通过Doctrine的Symfony ..)
我的表单是我的ajax请求的瓶颈.
$order = $this->getDoctrine()
->getRepository('AcmeMyBundle:Order')
->find($id);
$order = $order ? $order : new Order();
$form = $this->createForm(new OrderType(), $order);
$formView = $form->createView();
return $this->render(
'AcmeMyBundle:Ajax:order_edit.html.twig',
array(
'form' => $formView,
)
);
Run Code Online (Sandbox Code Playgroud)
为了更清晰的代码我删除了stopwatch语句.
我的OrderType有下一个字段:
$builder
->add('status') // enum (string)
->add('paid_status') // enum (string)
->add('purchases_price') // int
->add('discount_price') // int
->add('delivery_price') // int
->add('delivery_real_price', null, array('required' => false)) // int
->add('buyer_name') // string
->add('buyer_phone') // string
->add('buyer_email') // string
->add('buyer_address') // string
->add('comment') // string
->add('manager_comment') // string …Run Code Online (Sandbox Code Playgroud) 我有一个这样的课:
class Student {
const GENDER_MALE = "male", GENDER_FEMALE = "female";
/**
* @var string $gender
*
* @ORM\Column(name="gender", type="string", length=50,nullable=false)
* @Assert\NotBlank(message="Gender cannot be blank",groups={"new"})
* @Assert\Choice(choices = {"male", "female"}, message = "Choose a valid gender.", groups={"new"})
*/
private $gender;
Run Code Online (Sandbox Code Playgroud)
我必须硬编码值"male"和"female".可以这样做吗?
choices = {self :: GENDER_MALE,self :: GENDER_FEMALE}
doctrine-orm ×10
php ×6
symfony ×6
doctrine ×2
many-to-many ×2
dql ×1
forms ×1
jointable ×1
properties ×1