আমি ডক্ট্রিন 2 ব্যবহার করে কাঁচা এসকিউএল সম্পাদন করতে চাই
আমার ডেটাবেস টেবিলগুলি ছাঁটাই করা এবং ডিফল্ট পরীক্ষার ডেটা দিয়ে টেবিলগুলি আরম্ভ করতে হবে।
উত্তর:
মতবাদ 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 );
আমি পিডিও ব্যবহার করছি বলে ধরে নিলাম এটি করে এটি কাজ করেছিলাম।
//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();
আপনার ক্যোয়ারী তৈরি করুন এবং সমস্ত আনুন:
$result= $conn->query('select foobar from mytable')->fetchAll();
ফলাফলের মতো ডেটা এইভাবে পান:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
আমি উত্তরটি সম্ভবত খুঁজে পেয়েছি:
একটি নেটিভিকুয়েরি আপনাকে আপনার স্পেসিফিকেশন অনুসারে ফলাফল ম্যাপিংয়ে নেটিভ এসকিউএল কার্যকর করতে দেয়। এই জাতীয় স্পেসিফিকেশন যা বর্ণনা করে যে কোনও এসকিউএল ফলাফল সেট কীভাবে একটি মতবাদ ফলাফলের সাথে ম্যাপ করা হয় তাকে রেজাল্টসেটম্যাপিং দ্বারা উপস্থাপন করা হয়।
উত্স: নেটিভ এসকিউএল ।
আমারও একই সমস্যা ছিল। আপনি সত্তা পরিচালক দ্বারা সরবরাহিত সংযোগ অবজেক্টটি দেখতে চান:
$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 এ সংযোগ বস্তুর জন্য ডকগুলি দেখুন
আপনার মডেলটিতে কাঁচা এসকিউএল স্টেটমেন্ট তৈরি করুন (নীচে উদাহরণস্বরূপ আমাকে ব্যবহার করতে হবে এমন একটি তারিখের অন্তর্ভুক্তের উদাহরণ রয়েছে তবে আপনার নিজের বিকল্প প্রতিস্থাপন করুন you আপনি যদি একটি নির্বাচন করছেন তবে>> এক্সিকিউট () কলটিতে ফেচেল যোগ করুন)।
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
আপনি পারবেন না, মতবাদ 2 কাঁচা প্রশ্নের জন্য অনুমতি দেয় না। আপনি এটি করতে পারেন মনে হতে পারে তবে আপনি যদি এরকম কিছু চেষ্টা করেন:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
মতবাদ একটি ত্রুটি ছুঁড়ে মারবে বলে যে DATE_FORMAT একটি অজানা ফাংশন।
তবে আমার ডাটাবেসটি (মাইএসকিএল) সেই ফাংশনটি জানে, তাই মূলত যা হ্যাপেন হচ্ছে তা হ'ল ডক্ট্রাইন সেই জিজ্ঞাসাকে পর্দার পিছনে (এবং আপনার পিছনের পিছনে) বিশ্লেষণ করছে এবং কোয়েরিটিকে অবৈধ বলে বিবেচনা করে এটি বোঝে না এমন একটি অভিব্যক্তি খুঁজে পাচ্ছে।
সুতরাং যদি আমার মতো আপনি কেবল ডেটাবেজে একটি স্ট্রিং প্রেরণ করতে সক্ষম হন এবং এটি এটির সাথে মোকাবিলা করতে দিন (এবং বিকাশকারীকে সুরক্ষার জন্য পুরো দায়িত্ব নিতে দিন), এটি ভুলে যান।
অবশ্যই আপনি কোনও বা কোনও উপায়ে এটির অনুমতি দেওয়ার জন্য একটি এক্সটেনশনের কোড করতে পারেন, তবে আপনি এটি করার জন্য মাইসকিলি ব্যবহার করে বন্ধ করে দিয়েছেন এবং মতবাদকে এটি ওআরএম বয়েসনে ছেড়ে চলেছেন।
mysqldump
আগের কাজগুলি থেকে ডেটা লোড করা বা টেবিলগুলি ফেলে দেওয়া, আমি সাধারণত সেই কাজের জন্য একটি শেল স্ক্রিপ্ট লিখি এবং তারপরে সিমফনি 2 ভাষায় একটি টাস্ক (বা "কমান্ড") লিখি ) যা শেল স্ক্রিপ্টটি কার্যকর করে। একটি ওআরএমের উদ্দেশ্য, যেমনটি আমি এটি বুঝতে পেরেছি পুনরাবৃত্তিমূলক কাজকে দূরে সরিয়ে দেওয়া এবং আপনি যদি কোনও টেবিল কাটানোর মতো কিছু করছেন, তবে আমি দেখছি না যে, মতবাদ কীভাবে ছবিতে আনতে হবে, কারণ মতবাদ মতবাদ না করে এই কাজটিকে আরও সহজ করে তুলুন না।