我有大约40个实体和许多双向关系.每当我使用var_dump($ user)或任何实体时,我的浏览器都会加载过多的数组和变量数据,那么它就会崩溃.
我想问一下这个问题.
数据正在插入正常.我可以在生产中引起问题吗?
我正在使用Zend Framework 2和Doctrine 2开发我的应用程序.
虽然书面方式说明,我无法理解之间的差异mappedBy和inversedBy.
我应该什么时候使用mappedBy?
我应该什么时候使用inversedBy?
我什么时候不用?
这是一个例子:
/**
*
* @ORM\OneToOne(targetEntity="\custMod\Entity\Person", mappedBy="customer")
* @ORM\JoinColumn(name="personID", referencedColumnName="id")
*/
protected $person;
/**
*
* @ORM\OneToOne(targetEntity="\Auth\Entity\User")
* @ORM\JoinColumn(name="userID", referencedColumnName="id")
*/
protected $user;
/**
*
* @ORM\ManyToOne (targetEntity="\custMod\Entity\Company", inversedBy="customer")
* @ORM\JoinColumn (name="companyID", referencedColumnName="id")
*/
protected $company;
Run Code Online (Sandbox Code Playgroud)
我做了一个快速搜索,发现了以下内容,但我仍感到困惑:
我的实体使用此注释作为其ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Run Code Online (Sandbox Code Playgroud)
在干净的数据库中,我从旧数据库导入现有记录并尝试保留相同的ID.然后,在添加新记录时,我希望MySQL像往常一样自动增加ID列.
不幸的是,Doctrine2似乎完全忽略了指定的ID.
新解决方案
根据以下建议,以下是首选解决方案:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());
Run Code Online (Sandbox Code Playgroud)
旧解决方案
因为Doctrine偏离ClassMetaData来确定生成器策略,所以在管理EntityManager中的实体之后必须对其进行修改:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Run Code Online (Sandbox Code Playgroud)
我刚刚在MySQL上对它进行了测试,它按预期工作,这意味着具有自定义ID的实体与该ID一起存储,而没有指定ID的实体使用了lastGeneratedId() + 1.
我想在学说中做复合唯一键.那些是我的领域:
/**
* @var string $videoDimension
*
* @Column(name="video_dimension", type="string", nullable=false)
*/
private $videoDimension;
/**
* @var string $videoBitrate
*
* @Column(name="video_bitrate", type="string", nullable=false)
*/
private $videoBitrate;
Run Code Online (Sandbox Code Playgroud)
我如何展示学说,那些结合在一起的是复合的唯一关键?
我正在开发游戏应用程序并使用Symfony 2.0.我对后端有很多AJAX请求.更多的响应是将实体转换为JSON.例如:
class DefaultController extends Controller
{
public function launchAction()
{
$user = $this->getDoctrine()
->getRepository('UserBundle:User')
->find($id);
// encode user to json format
$userDataAsJson = $this->encodeUserDataToJson($user);
return array(
'userDataAsJson' => $userDataAsJson
);
}
private function encodeUserDataToJson(User $user)
{
$userData = array(
'id' => $user->getId(),
'profile' => array(
'nickname' => $user->getProfile()->getNickname()
)
);
$jsonEncoder = new JsonEncoder();
return $jsonEncoder->encode($userData, $format = 'json');
}
}
Run Code Online (Sandbox Code Playgroud)
我的所有控制器都做同样的事情:获取一个实体并将其一些字段编码为JSON.我知道我可以使用规范化器并对所有权限进行编码.但是,如果一个实体已经循环链接到其他实体呢?或实体图非常大?你有什么建议吗?
我想一下实体的一些编码模式......或者NormalizableInterface用来避免循环..,
我在Aib\PlatformBundle\Entity\User.php中有一个实体类
尝试通过创建表单类没有问题
php app/console doctrine:generate:form AibPlatformBundle:User
现在我将命名空间更改为Aib\PlatformBundle\Entity\Identity\User,但是当我尝试使用我之前说过的任务生成表单时,它说:
"Class Aib\PlatformBundle\Entity\User不是有效的实体或映射的超类."
这是文件内容:
<?php
namespace Aib\PlatformBundle\Entity\Identity;
use Doctrine\ORM\Mapping as ORM;
/**
* Aib\PlatformBundle\Entity\Identity\User
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Aib\PlatformBundle\Entity\Identity
\UserRepository")
*/
class User
{
...
Run Code Online (Sandbox Code Playgroud)
任何的想法?
symfony2.0.4
(对不起我的语无伦次问题:我在撰写这篇文章时试图回答一些问题,但这里是:)
我正在尝试在链接表中创建一个具有多对多关系的数据库模型,但每个链接也有一个值,在这种情况下是一个库存表.(这是我遇到的更多问题的一个基本示例,但我想我会在继续之前用它测试它).

我已经使用exportmwb为这个简单的例子生成了两个Entities Store和Product,两者都显示在下面.
但是,现在的问题是我无法弄清楚如何使用Doctrine访问stock.amount值(signed int,因为它可能是负数).此外,当我尝试使用doctrine的orm创建表时:schema-tool:create function

这只产生了两个实体和三个表,一个是没有值的链接表和两个数据表,因为多对多关系本身不是实体,因此我只能将Product和Store作为实体.
所以,从逻辑上讲,我尝试更改我的数据库模型,将库存作为一个单独的表,与商店和产品的关系.我还重写了字段名,只是为了能够将其排除为问题的根源:

然后我发现我仍然没有得到Stock实体......而且数据库本身没有'amount'字段.
我真的需要能够将这些商店和产品捆绑在一个库存表(以及其他东西)中......所以只是在产品本身上添加库存不是一种选择.
root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK] Entity\Product
[OK] Entity\Store
Run Code Online (Sandbox Code Playgroud)
当我创建数据库时,它仍然没有在stock表中给我正确的字段:

所以,在这里查看一些内容,我发现多对多连接不是实体,因此不能有值.所以我尝试将它更改为一个与其他表有关系的单独表,但它仍然无效.
我在这做错了什么?
我有一个看起来像这样的实体:
/**
* @Gedmo\Tree(type="nested")
* @ORM\Table(name="categories")
* @ORM\Entity()
*/
class Category extends BaseCategory
{
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
*/
protected $children;
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $parent;
}
Run Code Online (Sandbox Code Playgroud)
我试图运行这样的查询:
$qb = $this->em->createQueryBuilder()
->select('c.parent')
->from('Category', 'c');
$result = $qb->getQuery()->getArrayResult();
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
[Semantical Error] ... Error: Invalid PathExpression. Must be a StateFieldPathExpression.
Run Code Online (Sandbox Code Playgroud)
如何从表中选择parent_id字段.我尝试了很多变化,即使我做了这样的事情:
$qb = $this->em->createQueryBuilder()
->select('c')
->from('Category', 'c');
Run Code Online (Sandbox Code Playgroud)
除了 parent_id 之外,我得到表中的所有字段.这似乎是学说正在阻碍.如何查询此parent_id字段?或者更好的是如何获得表中的所有字段,包括parent_id
让我们假设我检索一个实体$e并用setter修改它的状态:
$e->setFoo('a');
$e->setBar('b');
Run Code Online (Sandbox Code Playgroud)
有没有可能检索已更改的字段数组?
在我的例子的情况下,我想要检索foo => a, bar => b结果
PS:是的,我知道我可以修改所有的访问者并手动实现这个功能,但我正在寻找一些方便的方法来做到这一点
有没有方便的方法可以让我连接两个Doctrine ArrayCollection()?就像是:
$collection1 = new ArrayCollection();
$collection2 = new ArrayCollection();
$collection1->add($obj1);
$collection1->add($obj2);
$collection1->add($obj3);
$collection2->add($obj4);
$collection2->add($obj5);
$collection2->add($obj6);
$collection1->concat($collection2);
// $collection1 now contains {$obj1, $obj2, $obj3, $obj4, $obj5, $obj6 }
Run Code Online (Sandbox Code Playgroud)
我只是想知道我是否可以保存我迭代第二个集合并逐个添加每个元素到第一个集合.
谢谢!
doctrine-orm ×10
php ×7
symfony ×5
doctrine ×3
mysql ×2
ajax ×1
debugging ×1
dql ×1
symfony-2.1 ×1