Php 原则2.1-一方关系、数据下载
我有两门课:Php 原则2.1-一方关系、数据下载,php,doctrine-orm,Php,Doctrine Orm,我有两门课: 用户: /** @Entity @Table(name="users") */ class User { /** * @Id @GeneratedValue @Column(type="integer") * @var integer */ protected $id; /** * @Column(type="string", length=20, unique=TRUE) * @var string
用户:
/** @Entity @Table(name="users") */
class User {
/**
* @Id @GeneratedValue @Column(type="integer")
* @var integer
*/
protected $id;
/**
* @Column(type="string", length=20, unique=TRUE)
* @var string
*/
protected $login;
/**
* @OneToMany(targetEntity="News", mappedBy="author")
*/
protected $news;
public function __construct() {
$this->news = new \Doctrine\Common\Collections\ArrayCollection;
}
}
/** @Entity @Table(name="news") */
class News {
/**
* @Id @GeneratedValue @Column(type="integer")
* @var integer
*/
protected $id;
/**
* @Column(type="string", length=100)
* @var string
*/
protected $title;
/**
* @Column(type="text")
* @var string
*/
protected $content;
/**
* @ManyToOne(targetEntity="User", inversedBy="news")
* @JoinColumn(referencedColumnName="id")
*/
protected $author;
}
和新闻:
/** @Entity @Table(name="users") */
class User {
/**
* @Id @GeneratedValue @Column(type="integer")
* @var integer
*/
protected $id;
/**
* @Column(type="string", length=20, unique=TRUE)
* @var string
*/
protected $login;
/**
* @OneToMany(targetEntity="News", mappedBy="author")
*/
protected $news;
public function __construct() {
$this->news = new \Doctrine\Common\Collections\ArrayCollection;
}
}
/** @Entity @Table(name="news") */
class News {
/**
* @Id @GeneratedValue @Column(type="integer")
* @var integer
*/
protected $id;
/**
* @Column(type="string", length=100)
* @var string
*/
protected $title;
/**
* @Column(type="text")
* @var string
*/
protected $content;
/**
* @ManyToOne(targetEntity="User", inversedBy="news")
* @JoinColumn(referencedColumnName="id")
*/
protected $author;
}
我什么时候做这个代码
$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = '.$id);
$user = $q->getSingleResult();
条令是否会从数据库中下载所有新闻(由特定用户创建)?除非您通过调用新闻访问器方法请求用户的新闻,否则条令不会下载。如果将查询重写为
SELECT u, n FROM User u JOIN u.news n
然后,一个用户和他的新闻都将作为结果返回
您还可以使用记录器检查条令生成的查询:
$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger);
PS:永远不要在查询中这样做:u.id='.$id
,以避免sql注入。相反,请使用占位符:
$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = :id');
$q->setParameter('id', $id);
直到您通过调用news accessor方法请求用户的新闻,它才会生效。如果将查询重写为
SELECT u, n FROM User u JOIN u.news n
然后,一个用户和他的新闻都将作为结果返回
您还可以使用记录器检查条令生成的查询:
$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger);
PS:永远不要在查询中这样做:u.id='.$id
,以避免sql注入。相反,请使用占位符:
$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = :id');
$q->setParameter('id', $id);
谢谢你的建议:)。下一个问题。只有当我使用
$User->getNews()
方法时,才会从DB下载用户的新闻?在您的示例中,如我在回答中所述,是的。否则它将下载真实应用程序中的所有数据库:)谢谢您的建议:)。下一个问题。只有当我使用$User->getNews()
方法时,才会从DB下载用户的新闻?在您的示例中,如我在回答中所述,是的。否则它将下载真实应用程序中的所有数据库:)