Doctrine 2'yi kullanarak ham SQL yürütmek istiyorum
Veritabanı tablolarını kesmem ve tabloları varsayılan test verileriyle başlatmam gerekiyor.
Yanıtlar:
İşte Doctrine 2'de yaptığım bir ham sorgu örneği:
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);
ve koşmak zorunda değildim$stmt->execute();
EntityManagerInterface $entityManager
$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
PDO kullandığınızı varsayarak, bunu yaparak çalışmasını sağladım.
//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’i ihtiyaçlarınıza göre değiştirebilirsiniz.
Yöneticinize bağlanın ve yeni bir bağlantı kurun:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Sorgunuzu oluşturun ve fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
Verileri sonuçtan şu şekilde alın:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Cevabın muhtemelen olduğunu öğrendim:
Bir NativeQuery, sonuçları spesifikasyonlarınıza göre eşleyerek yerel SQL'i çalıştırmanıza izin verir. Bir SQL sonuç kümesinin bir Doktrin sonucuna nasıl eşlendiğini açıklayan böyle bir belirtim, bir Sonuç Kümesi Eşleme ile temsil edilir.
Kaynak: Yerel SQL .
Ben de aynı sorunu yaşadım. Varlık yöneticisi tarafından sağlanan bağlantı nesnesine bakmak istiyorsunuz:
$conn = $em->getConnection();
Daha sonra doğrudan ona karşı sorgulayabilir / çalıştırabilirsiniz:
$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 adresindeki bağlantı nesnesinin belgelerine bakın.
Modelinizde ham SQL deyimini oluşturun (aşağıdaki örnek, kullanmam gereken ancak kendi tarih aralığının yerine geçecek bir tarih aralığı örneğidir. Execute () çağrısına bir SELECT add -> fetchall () yapıyorsanız.
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
Yapamazsınız, Doctrine 2 ham sorgulara izin vermez. Yapabileceğin gibi görünebilir ama böyle bir şey denersen:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doktrin, DATE_FORMAT'ın bilinmeyen bir işlev olduğunu söyleyen bir hata verecektir.
Ancak veritabanım (mysql) bu işlevi biliyor, yani temelde olan şey, Doctrine'in bu sorguyu perde arkasında (ve arkanızda) ayrıştırması ve sorgunun geçersiz olduğunu düşünerek anlamadığı bir ifade bulmasıdır.
Yani benim gibi veritabanına basitçe bir dizge gönderebilmek ve bununla ilgilenmesine izin vermek (ve güvenlik için tüm sorumluluğu geliştiricinin almasına izin vermek) istiyorsanız, unutun.
Elbette bir uzantıyı bir şekilde buna izin verecek şekilde kodlayabilirsiniz, ancak bunu yapmak için mysqli'yi kullanıp Doctrine'i ORM işine bırakmanız daha iyi olur.
mysqldump
önceki dökümlerden veri yüklemek veya tabloları düşürmek gibi, genellikle o iş için bir kabuk komut dosyası yazıyorum ve sonra Symfony2 dilinde bir görev (veya "komut" yazıyorum) ) Kabuk betiğini çalıştıran. Bir ORM'nin amacı, anladığım kadarıyla, tekrar eden çalışmayı soyutlamaktır ve bir masayı kesmek gibi bir şey yapıyorsanız, Doktrini resme getirmenin ne kadar mantıklı olacağını anlamıyorum çünkü Doktrin bunu yapmaz. Bu görevi daha kolay hale getirin.