답변:
다음은 제가하고있는 Doctrine 2의 원시 쿼리의 예입니다.
public function getAuthoritativeSportsRecords()
{
$sql = "
SELECT name,
event_type,
sport_type,
level
FROM vnn_sport
";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
...getConnection()->query($sql);
그리고 실행할 필요가 없었습니다$stmt->execute();
EntityManagerInterface $entityManager
한 다음 전화를 걸 수 있습니다.$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
나는 당신이 PDO를 사용하고 있다고 가정하고 이것을 수행하여 작동하도록했습니다.
//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";
//set parameters
//you may set as many parameters as you have on your query
$params['color'] = blue;
//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);
필요에 맞게 FETCH_TYPE을 변경할 수 있습니다.
관리자와 연결하고 새로운 연결을 만드십시오.
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
쿼리를 만들고 fetchAll :
$result= $conn->query('select foobar from mytable')->fetchAll();
다음과 같은 결과에서 데이터를 가져옵니다.
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
나는 대답이 아마도 다음과 같다는 것을 알았습니다.
NativeQuery를 사용하면 기본 SQL을 실행하여 사양에 따라 결과를 매핑 할 수 있습니다. SQL 결과 집합이 Doctrine 결과에 매핑되는 방법을 설명하는 이러한 사양은 ResultSetMapping으로 표시됩니다.
출처 : Native SQL .
나는 같은 문제가 있었다. 엔티티 관리자가 제공하는 연결 객체를보고 싶습니다.
$conn = $em->getConnection();
그런 다음 직접 쿼리 / 실행할 수 있습니다.
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
연결 개체에 대한 문서는 http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html 을 참조하십시오.
모델에서 원시 SQL 문을 만듭니다 (아래 예제는 내가 사용해야하지만 자신의 것으로 대체해야하는 날짜 간격의 예입니다. SELECT를 수행하는 경우 execute () 호출에-> fetchall () 추가).
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
그럴 수 없습니다. Doctrine 2는 원시 쿼리를 허용하지 않습니다. 할 수있는 것처럼 보일 수 있지만 다음과 같이 시도하면 :
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine은 DATE_FORMAT이 알 수없는 함수라는 오류를 표시합니다.
그러나 내 데이터베이스 (mysql)는 그 기능을 알고 있으므로 기본적으로 Doctrine은 쿼리가 잘못된 것으로 간주하여 장면 뒤 (그리고 뒤에서) 해당 쿼리를 구문 분석하고 이해할 수없는 표현식을 찾는 것입니다.
따라서 저처럼 단순히 문자열을 데이터베이스에 보내고 처리하도록하고 싶다면 (개발자가 보안에 대한 모든 책임을지게하도록) 잊어 버리십시오.
물론 어떤 식 으로든이를 허용하도록 확장을 코딩 할 수 있지만 mysqli를 사용하여이를 수행하고 Doctrine을 ORM 비즈니스에 맡기는 것도 좋습니다.
mysqldump
s를 수행 하거나 이전 덤프에서 데이터를로드하거나 테이블을 삭제 하는 것과 같은 자동화 된 데이터베이스 지저분한 작업을 수행하려면 일반적으로 해당 작업에 대한 셸 스크립트를 작성한 다음 Symfony2 언어로 작업 (또는 "명령")을 작성합니다. ) 쉘 스크립트를 실행합니다. 내가 아는 한 ORM의 목적은 반복적 인 작업을 추상화하는 것입니다. 그리고 만약 당신이 테이블을 자르는 것과 같은 일을한다면, Doctrine이 그림에 포함되지 않았기 때문에 어떻게 이해가 될지 모르겠습니다. 그 작업을 더 쉽게 만듭니다.