我是Symfony和Doctrine的新手.
我有一个实体"用户"和一个实体"类型".一个用户可以拥有一个喜欢的类型,一个类型可以拥有许多具有该特定类型作为收藏的用户.所以我需要一个多(用户)到一个(类型)的关系.
我实现了它,它工作正常(大多数情况下).但有一件事我不明白.
如果我做这样的事情它的作用:
$user = new User();
$type = new Type();
$user->setFavoriteType($type);
$em->persist($user);
$em->persist($type);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
生成对象并将其存储到DB.并且正确设置了favorite_type_id.所以改变拥有方可以按预期工作.
但是如果我将用户添加到反面(仅)并刷新实体管理器,则不设置favorite_type_id.
$user = new User();
$type = new Type();
$type->getUsers()->add($user); //same with $type->addUser($user);
$em->persist($user);
$em->persist($type);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
这是为什么?有没有理由说它不能从反面起作用?我真的必须手动设置吗?如果我操作类型实体中的addUser方法,如"$ user-> setFavoriteType($ this)",它可以工作.但这不应该是学说的任务吗?
文件说
更新双向关联时,Doctrine仅检查双方中的一方以查找这些更改.这被称为协会的拥有方.
所以这似乎是通缉行为,是吗?但为什么?由于表现?语义原因?
如果有人可以向我解释或告诉我我做错了什么,我会很高兴的.
我正在制作一个可以发送电子邮件或短信的信使,并且可以立即发送或稍后发送(信息保存在数据库中).我已经做了两个解决方案,但两个都不令我满意.
我正在将代码集中在一个Factory中,而Factory模式的代码非常简单:
class MessageFactory
{
static public function get($type,$em)
{
$instance = null;
switch ($type) {
case 'email':
$instance = new EmailMessage($em);
break;
....
return $instance;
}
class EmailMessage implements MessangerInterface
{
...
public function send( $eMessage,array $receivers, $time=NULL)
{
interface MessangerInterface
{
public function send($message,array $receivers);
}
Run Code Online (Sandbox Code Playgroud)
第一个解决方案:只需调用普通的静态方法
$messanger = Factory\MessageFactory::get('email',$em);
$messanger->send($eMessage, array('tom'=>'tom@gmail.com'));
Run Code Online (Sandbox Code Playgroud)
这是一个糟糕的解决方案,因为我需要将Doctrine Manager作为参数传递给方法
第二种解决方案:将其用作Symfony 2服务
services:
my.messanger:
class: Bundle\Factory\MessangerInterface
factory_class: Bundle\Factory\MessageFactory
factory_method: get
arguments:
messanger_type: %messanger.type%
Run Code Online (Sandbox Code Playgroud)
并且还将学说作为论据传递.但是使用这样的解决方案我不能在我的代码中选择messanger.type,它使用配置参数定义为email或sms; 我需要在代码中具有选择类型的能力.
另外我有一个问题,我需要在课堂上发送电子邮件或短信,这意味着我需要一个外部服务,得到这样的:
class EmailMessage …Run Code Online (Sandbox Code Playgroud) 我对Symfony2中的Doctrine的YAML配置有疑问.
我通过"doctrine:generate:entity"创建了一个实体,并选择了YAML作为映射格式.这没有在../Entity/"MyEntity".php上添加任何元数据,这将允许我更新或创建我的架构.
举个例子,如果我跑
./app/console doctrine:schema:create
Run Code Online (Sandbox Code Playgroud)
它失败了,说:
[RuntimeException]
Bundle "MySuperBundle" does not contain any mapped entities.
Run Code Online (Sandbox Code Playgroud)
我的自动化已经设置为"true".
如果我选择使用注释配置,这不会是一个问题.
我错过了什么?我还有什么额外的步骤吗?
提前谢谢,问候,
伊万