我有一个DateTime领域:
/**
* Date time posted
* @Column(type="datetime")
*/
private $dtPosted;
Run Code Online (Sandbox Code Playgroud)
通过使用LifeCycleCallback将其设置为默认值
/**
* @PrePersist
*/
function onPrePersist() {
// set default date
$this->dtPosted = date('Y-m-d H:m:s');
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
致命错误:在第46行的D:\ ResourceLibrary\Frameworks\Doctrine\lib\Doctrine\DBAL\Types\DateTimeType.php中的非对象上调用成员函数format()
我想在我的Doctrine 2实体中创建一个唯一的约束,以便name&test是唯一的列.含义
OBJ1
OBJ2
这应该会在测试重复时触发错误.
我尝试使用唯一约束(Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity).试着
* @UniqueEntity("name")
* @UniqueEntity("test")
Run Code Online (Sandbox Code Playgroud)
和
* @UniqueEntity({"name", "test"})
Run Code Online (Sandbox Code Playgroud)
当我有两个名称和测试重复时,两者似乎只触发错误.例如.
OBJ1
OBJ2
什么是正确的设置?或者我可能在某个地方犯了错误?
也许我应该包括如下的学说注释:
@Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
Run Code Online (Sandbox Code Playgroud)
但是我觉得那仍然不能处理我的symfony表单验证?
UPDATE
我的测试代码:
/**
* @ORM\Entity
* @ORM\Table(name="roles")
* @UniqueEntity("name")
* @UniqueEntity("test")
*/
class Role {
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var string
*
* @ORM\Column(type="string", length=32, unique=true)
* @Assert\MaxLength(32)
* @Assert\Regex("/^[a-zA-Z0-9_]+$/")
*/ …Run Code Online (Sandbox Code Playgroud) 我有一个通过@ORM\ManyToMany在Symfony2/Doctrine中使用注释创建的连接表.它加入Category和Parameter表.
现在我想删除Parameter表中的所有参数.因为在join-table上定义了外键约束,所以我不能只从Parameter表中删除行.首先,我必须从join-table中删除子行.但是Dotrine的DQL语法需要给出实体的名称,例如:
DELETE Project\Entity\EntityName
Run Code Online (Sandbox Code Playgroud)
但是使用ManyToMany关联生成的连接表实体的名称是什么?怎么处理呢?
或者,如何在@ORM\ManyToMany注释定义的连接表中的外键约束上设置ON UPDATE CASCADE和ON DELETE CASCADE .
编辑:
连接表模式:
CREATE TABLE `categories_params` (
`category_id` INT(11) NOT NULL,
`param_id` INT(11) NOT NULL,
PRIMARY KEY (`category_id`, `param_id`),
INDEX `IDX_87A730CB12469DE2` (`category_id`),
INDEX `IDX_87A730CB5647C863` (`param_id`),
CONSTRAINT `categories_params_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `allegro_category` (`id`),
CONSTRAINT `categories_params_ibfk_2` FOREIGN KEY (`param_id`) REFERENCES `category_param` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
on UPDATE并且on DELETE在默认情况下被设置为RESTRICT
最终解决方案将是:
* @ORM\ManyToMany(targetEntity="CategoryParam", cascade={"persist","remove"})
* @ORM\JoinTable(name="categories_params",
* joinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")},
* …Run Code Online (Sandbox Code Playgroud) 我试图重现这个查询:
SELECT * FROM `request_lines`
where request_id not in(
select requestLine_id from `asset_request_lines` where asset_id = 1
)
Run Code Online (Sandbox Code Playgroud)
在doctrine查询构建器中,我被困在where_id不在的位置(选择
我目前有:
$linked = $em->createQueryBuilder()
->select('rl')
->from('MineMyBundle:MineRequestLine', 'rl')
->where()
->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud) 我想在本机SQL中执行一个看起来像这样的查询:
SELECT
AVG(t.column) AS average_value
FROM
table t
WHERE
YEAR(t.timestamp) = 2013 AND
MONTH(t.timestamp) = 09 AND
DAY(t.timestamp) = 16 AND
t.somethingelse LIKE 'somethingelse'
GROUP BY
t.somethingelse;
Run Code Online (Sandbox Code Playgroud)
如果我试图在Doctrine的查询生成器中实现这个,如下所示:
$qb = $this->getDoctrine()->createQueryBuilder();
$qb->select('e.column AS average_value')
->from('MyBundle:MyEntity', 'e')
->where('YEAR(e.timestamp) = 2013')
->andWhere('MONTH(e.timestamp) = 09')
->andWhere('DAY(e.timestamp) = 16')
->andWhere('u.somethingelse LIKE somethingelse')
->groupBy('somethingelse');
Run Code Online (Sandbox Code Playgroud)
我得到错误异常
[语法错误]第0行,第63行:错误:预期的已知函数,得到'年'
如何使用Doctrines查询构建器实现我的查询?
笔记:
YEAR()等语句,例如,如此处所示.但我正在寻找避免包含第三方插件的方法.我正在尝试使用Symfony2,并一直在尝试为我的应用程序的模型层设置自动化测试.Symfony2书谈到了控制器的单元测试,但我找不到很多模型测试的例子.
我希望在每次测试运行之前都有一个干净的数据集,并找到这些文章:
根据sznapka.pl文章,我有一个实际运行的测试没有错误,但是虽然创建了测试模式,但是没有加载.我看不出为什么,甚至是一种调试方法.
背景:我之前使用的是CakePHP,其中夹具的装载很大程度上是自动处理的,也许我对Symfony/Doctrine有错误的方法?
我目前在一个地方,我需要在foreach循环中创建或更新实体.
所以我正在做以下(短代码):
foreach ($dataset as $data) {
$entity = new Entity();
// ---- Some setting operations on the entity
$em->persist($entity);
}
$em->flush();
Run Code Online (Sandbox Code Playgroud)
我期待的是Doctrine管理实体,然后用一个语句将实体插入表中.
但它发生了,Doctrine为每个创建的实体创建了一个语句.由于$ dataset数组可能相当大(创建了很多实体),我想把它打包成一个语句.
我怎样才能做到这一点?
如何在doctrine querybuilder中使用表达式mysql NOW()?
我试图模拟一个PHP final class但是因为它被声明final我一直收到这个错误:
PHPUnit_Framework_Exception: Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.
反正final是为了我的单元测试而不引入任何新框架来解决这种行为?
我正在尝试从Symfony 3应用程序连接到MySQL数据库.但是当尝试从Symfony控制台命令创建MySQL模式时,我收到此错误:PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers
PHP和MySQL都在Docker容器中运行.
MySQL版本: 8.0.1
PHP版本: 7.1.3
司机: pdo_mysql
字符集: UTF8
DSN: "mysql:host=mysql;dbname=database;charset=UTF8;"
有任何想法吗?
doctrine-orm ×10
symfony ×6
mysql ×4
doctrine ×3
php ×3
unit-testing ×2
mocking ×1
pdo ×1
phpunit ×1
sql ×1
validation ×1