我的第一个symfony2项目是存储在数据库中的guest虚拟机列表(在事件中受邀).我有
最后在Controller中使用"createGuest"方法,一切正常.
我无法从数据库中删除guest虚拟机.我已经阅读了网络上的每个教程,包括官方的Symfony2书; 所有它说的是:
删除对象
删除对象非常相似,但需要调用实体管理器的remove()方法:
$em->remove($product);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
关于如何将控制器deleteAction($ id)与twig模板连接起来,它没有说更多(甚至"更新对象"部分缺少文档).我想要做的是列出所有具有viewGuests操作和viewGuests树枝模板的客人,每行旁边都有一个删除图标,您应该单击该图标以删除条目.很简单,但我找不到任何文档,也不知道从哪里开始.
public function deleteGuestAction($id)
{
$em = $this->getDoctrine()->getEntityManager();
$guest = $em->getRepository('GuestBundle:Guest')->find($id);
if (!$guest) {
throw $this->createNotFoundException('No guest found for id '.$id);
}
$em->remove($guest);
$em->flush();
return $this->redirect($this->generateUrl('GuestBundle:Page:viewGuests.html.twig'));
}
Run Code Online (Sandbox Code Playgroud) 上面两个选项有什么区别?什么时候最好选择每个选项?
是否可以使用Symfony2控制台工具从数据库生成单个实体?
在编码过程中,我必须添加一个表,并对现有的实体类进行了修改.所以我不希望我的所有实体都重新生成.
任何建议将不胜感激!
注意:如果我不想要的话,将接受"不可能"的答案
在关于继承映射的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?
代码只会导致错误消息"致命错误:调用未定义的方法...... :: get()".
<?php
namespace ...\Service;
use Doctrine\ORM\EntityManager;
use ...\Entity\Header;
class dsdsf
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function create()
{
$id = 10;
$em = $this->get('doctrine')->getEntityManager();
$em->getRepository('...')->find($id);
}
}
Run Code Online (Sandbox Code Playgroud)
services.yml
service:
site:
class: ...\Service\Site
Run Code Online (Sandbox Code Playgroud) 无法删除或更新父行:外键约束失败.
class Teacher {
/**
*@ORM\OneToMany(targetEntity="publication", mappedBy="teacher")
*/
protected $publications;
}
class Publication {
/**
* @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
* @ORM\JoinColumn(name="teacher_id", referencedColumnName="id")
*/
protected $teacher;
}
Run Code Online (Sandbox Code Playgroud)
我想要的是,当你删除教师时,id_teacher被修改为NULL.我想保留出版物但不参考教授.
我不知道在Doctrine中是怎么做的,这可能吗?或者总是与老师的关系?
我正在寻找测试以下静态方法的最佳方法(特别是使用Doctrine模型):
class Model_User extends Doctrine_Record
{
public static function create($userData)
{
$newUser = new self();
$newUser->fromArray($userData);
$newUser->save();
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会使用模拟对象来确保调用"fromArray"(使用提供的用户数据)和"save",但这是不可能的,因为该方法是静态的.
有什么建议?
我正在尝试使用一些User对象预先填充数据库,但是当我调用$user->setPassword('some-password');然后保存用户对象时,字符串'some-password'直接存储在数据库中,而不是散列+ salted密码.
我的DataFixture类:
// Acme/SecurityBundle/DataFixtures/ORM/LoadUserData.php
<?php
namespace Acme\SecurityBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\SecurityBundle\Entity\User;
class LoadUserData implements FixtureInterface
{
public function load(ObjectManager $manager)
{
$userAdmin = new User();
$userAdmin->setUsername('System');
$userAdmin->setEmail('system@example.com');
$userAdmin->setPassword('test');
$manager->persist($userAdmin);
$manager->flush();
}
}
Run Code Online (Sandbox Code Playgroud)
以及相关的数据库输出:
id username email salt password
1 System system@example.com 3f92m2tqa2kg8cookg84s4sow80880g test
Run Code Online (Sandbox Code Playgroud) 所以我发现了MySQL中最令人沮丧的错误.
显然,TIMESTAMP现场和支持功能不支持比秒更精确!?
所以我使用PHP和Doctrine,我真的需要那些微秒(我正在使用该actAs: [Timestampable]属性).
我发现我可以使用BIGINT字段来存储值.但是教条会加几毫秒吗?我认为它只是将NOW()赋予该领域.我也担心通过代码散布的日期操作函数(在SQL中)会破坏.
我还看到了有关编译UDF扩展的一些内容.这是不可接受的,因为我或未来的维护者将升级和噗,改变了.
有没有人找到合适的解决方法?
doctrine ×10
php ×5
symfony ×5
doctrine-orm ×2
cascade ×1
database ×1
inheritance ×1
mocking ×1
mysql ×1
null ×1
one-to-many ×1
orm ×1
phpunit ×1
set ×1
unit-testing ×1