我正在尝试使用 EntityManager 加载表中的所有字段及其关联,这是我的(测试)场景:我有实体 user 和实体 user_post,并且用户可以有多个 user_post。
用户:
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class user
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="bigint")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
public $id;
/**
* @ORM\OneToMany(targetEntity="user_post", mappedBy="id_user", cascade={"persist", "remove"}, orphanRemoval=TRUE, fetch="EAGER")
*/
public $posts;
/**
* @var string $author
*
* @ORM\Column(name="author", type="string", length=100, nullable=false)
*/
public $author;
/**
* @var text $content
*
* @ORM\Column(name="content", type="text", nullable=false)
*/
public $content;
/**
* @var text $createdAt
*
* @ORM\Column(name="created_at", type="text", nullable=false)
*/
public $createdAt;
public function __construct() {
$this->posts = new ArrayCollection();
}
}
用户帖子:
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class user_post
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="bigint")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
public $id;
/**
* @var integer $id_user
*
* @ORM\ManyToOne(targetEntity="user", inversedBy="posts")
* @ORM\JoinColumn(name="id_user", referencedColumnName="id", nullable=FALSE)
*/
public $id_user;
/**
* @var text $content
*
* @ORM\Column(name="content", type="text", nullable=false)
*/
public $content;
}
我使用公共(public)变量是为了更容易调试。
现在,我正在尝试:
$user = $doctrine->em->find('user', 2);
我得到了 user 对象,但是它返回了 user_post 对象:
Doctrine\ORM\PersistentCollection Object ( [snapshot:Doctrine\ORM\PersistentCollection:private] => Array ( [0] => user_post Object ( [id] => 1 [id_user] => user Object *RECURSION*
并且不返回实际数据。它还返回一个巨大的数组。
有没有办法用find函数获取所有数据?
最佳答案
您的 $posts
属性映射为 OneToMany
,这意味着 用户
将拥有许多 user_post
。
因此,$posts
被水合为 user_post
对象的集合,其中包含您期望的对象:
$user = $doctrine->em->find('user', 2);
foreach ($user->posts as $post) {
echo $post->content;
}
关于php - 通过原则查找连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20568247/