[英]Doctrine 2: How to remove the relation as well as the entity in a many-to-many association
[英]Propel: how to remove link made via many-to-many relation
(链接到上一个问题以防万一: 在管理表单中处理一对多关系)
我在我的 Symfony-1.3 / Propel-1.4 项目中User和Partner之间有这种多对多的关系。 保存用户时,如果某个 boolean 标志为真,我想清除所有与合作伙伴的链接。 这是我目前所做的,但它不起作用:
// inside the User model class
public function save(PropelPDO $con = null) {
if ($this->getIsBlaBla()) {
$this->setStringProperty(NULL);
$this->clearUserPartners();
}
parent::save($con);
}
将字符串属性设置为 NULL 有效; 查看数据库清楚地表明了这一点。 但是,USER_PARTNER 表仍然保存着用户和合作伙伴之间的关系。 所以我想我必须一一清除链接,如下所示:
foreach($this->getUserPartners() as $user_partner) {
$user_partner->delete();
//UserPartnerPeer::doDelete($user_partner); // tried that too
}
两者都不做伎俩。
正如我在上一个问题中提到的,我只是通过反复试验来猴子学习 Symfony,所以我显然错过了一些非常明显的东西。 请指出我正确的方向!
编辑:这是我如何使它工作的:
将代码移至表格 class,如下所示:
public function doSave(PropelPDO $con = null) {
parent::doSave($con);
if ($this->getObject()->getIsSiteOwner()) {
$this->getObject()->setType(NULL);
$this->getObject()->save();
foreach($this->getObject()->getUserPartners() as $user_partner) {
$user_partner->delete();
}
}
return $this->getObject();
}
public function updateObject($values = null) {
$obj = parent::updateObject($values);
if ($obj->getIsSiteOwner()) {
$obj->clearUserPartners();
}
return $this->object;
}
这是做什么的:
这就是我需要的。 感谢所有参与了的人。
好的,所以现在您有一个多对多关系,其中在数据库术语中实现为三个表(用户、合作伙伴和用户合作伙伴)。 同样的事情发生在 Symfony 和 Propel 上,所以你需要在应该在 UserForm 中声明的 doSave 方法上做这样的事情:
public function doSave($con = null)
{
parent::doSave($con); //First all that's good and nice from propel
if ($this->getValue('please_errase_my_partners_field'))
{
foreach($this->getObject()->getUserPartners() as $user_partner_relation)
{
$user_partner_relation->delete();
}
}
return $this->getObject();
}
检查应在 BaseUser.class.php (lib/model/om/BaseUser.class.php) 上声明的方法名称“getUserPartners”
如果您正在学习 Symfony,我建议您使用 Doctrine 而不是 Propel,因为我认为 Doctrine 比 Propel 更简单,更“漂亮”。
对于您的问题,我认为您正在走上正轨。 如果我是你,我会保留我的 function save()
我会在我的 model 用户中写另一个 function
public function clearUserPartners(){
// You have to convert this query to Propel query (I'm sorry, but I don't know the right syntax)
"DELETE FROM `USER_PARTNER` WHERE user_id = '$this->id'"
}
使用此 function,您不必使用 PHP foreach。
但我不明白StringProperty
的属性是什么......
UserPartnerQuery::create()->filterByUser( $userObject )->delete();
或者
UserPartnerQuery::create()->filterByUser( $partnerObject )->delete();
有同样的问题。 这是一个可行的解决方案。
问题是您的第二个解决方案,即。 遍历相关对象并在它们上调用 delete() 应该可以工作。 这是记录在案的做事方式(参见: http://www.symfony-project.org/book/1_0/08-Inside-the-Model-Layer#chapter_08_sub_saving_and_deleting_data )。
但是,与其用删除查询轰炸数据库,不如在一个 go 中删除它们,方法是向您的对等 class 添加一个方法,该方法使用简单的数据库查询执行删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.