ib.*_*mer 10 symfony doctrine-orm
从BD中删除内容时出现问题.
问题是它不仅擦除了我寻找的对象(使用findOneBy),而且还删除了与主要id相关的所有对象.
// ---控制器
$new = $this->getDoctrine()->getManager();
$OBJcar = $new->getRepository('SomeOtherBundle:CarEntityClass')
->findOneBy(array('idOwner' => $idowner, 'idCar' => $idcar));
if($OBJcar){
$new->remove($OBJcar);
$new->flush();
$msj="The car for an specific owner has been erased.";
}
Run Code Online (Sandbox Code Playgroud)
// --- Profiler(查询)
"START TRANSACTION"
Parameters: { }
Time: 0.22 ms
DELETE FROM schema.CarTable WHERE id_owner = ?
Parameters: ['123456']
Time: 0.63 ms
"COMMIT"
Parameters: { }
Time: 0.63 ms
Run Code Online (Sandbox Code Playgroud)
如何擦除我从数据库中获取的一行?
dra*_*nli 34
我投了上面的答案,因为我厌倦了使用字符串DQL的人.它不是非标准化的,非面向对象的(即使在后台dql中使用对象操作),它也不使用查询构建器提供的缓存机制,它不灵活,只是看起来不干净.
这是"正确的方式"(恕我直言):
这是代码:
namespace ProjectName\BundleName\Repository;
use Doctrine\ORM\EntityRepository;
class CarRepository extends EntityRepository
{
public function deleteCarWithOwner($ownerId,$carId)
{
$isDeleted = $this->createQueryBuilder("car")
->delete()
->where('car.id = :carId')->setParameter("carId", $carId)
->andWhere('car.idOwner = :ownerId')->setParameter("ownerId", $ownerId)
->getQuery()->execute();
return $isDeleted;
}
}
Run Code Online (Sandbox Code Playgroud)
另请参阅http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html以获取查询构建器详细信息.有许多"专业人士",我认为使用建设者没有"缺点".
最后更新
此外,使用DQL时不会调度很多Doctrine的实体事件.
使用DQL
$query = $em->createQuery('DELETE SomeOtherBundle:CarEntityClass c WHERE c.idOwner = 4 AND c.id = 10');
$query->execute();
Run Code Online (Sandbox Code Playgroud)
这将仅删除 ID 为 10 的单辆车和 ID 为 4 的车主。
| 归档时间: |
|
| 查看次数: |
17869 次 |
| 最近记录: |