মতবাদ 2 ব্যবহার করে কাঁচা এসকিউএল চালিত করুন ute


104

আমি ডক্ট্রিন 2 ব্যবহার করে কাঁচা এসকিউএল সম্পাদন করতে চাই

আমার ডেটাবেস টেবিলগুলি ছাঁটাই করা এবং ডিফল্ট পরীক্ষার ডেটা দিয়ে টেবিলগুলি আরম্ভ করতে হবে।


4
যাইহোক, যখন আমি স্বয়ংক্রিয় ডাটাবেস গ্রান্টওয়ার্ক করতে চাই, যেমন mysqldumpআগের কাজগুলি থেকে ডেটা লোড করা বা টেবিলগুলি ফেলে দেওয়া, আমি সাধারণত সেই কাজের জন্য একটি শেল স্ক্রিপ্ট লিখি এবং তারপরে সিমফনি 2 ভাষায় একটি টাস্ক (বা "কমান্ড") লিখি ) যা শেল স্ক্রিপ্টটি কার্যকর করে। একটি ওআরএমের উদ্দেশ্য, যেমনটি আমি এটি বুঝতে পেরেছি পুনরাবৃত্তিমূলক কাজকে দূরে সরিয়ে দেওয়া এবং আপনি যদি কোনও টেবিল কাটানোর মতো কিছু করছেন, তবে আমি দেখছি না যে, মতবাদ কীভাবে ছবিতে আনতে হবে, কারণ মতবাদ মতবাদ না করে এই কাজটিকে আরও সহজ করে তুলুন না।
জেসন সোয়েট

উত্তর:


166

মতবাদ 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();
}   

4
চমৎকার উত্তর. এই কোডটিতে সত্তা পরিচালক পেতে, আপনি এই কোডটির জায়গায় "$ this-> getDoctrine () -> getManager () ব্যবহার করতে পারেন " $ this-> getEntityManager () "এর উপরে , এইভাবে সরাসরি আমার জন্য এটি কাজ করে।
ওয়েবলবার

আরে এটি আমাকে অপরিবর্তিত পদ্ধতি সূচকে কল করুন :: getDoctrine () আমার কী করা উচিত
ডেক্সটার

আমি মতবাদের সাথে কোডইনিটার
ডেক্সটার

4
এটি আমাকে সঠিক দিকে নিয়ে গেছে তবে আমার যা প্রয়োজন তা ঠিক ছিল না। আমি সন্দেহ করি যে উত্তরটির বয়সটি একটি পার্থক্য করে। আমি ব্যবহার করেছি: ...getConnection()->query($sql);এবং চালাতে হবে না$stmt->execute();
ব্র্যান্ডন

নোট করুন যে সিমফনি 4 এবং অটোরিয়িংয়ের সাহায্যে আপনি ইঙ্গিতটি টাইপ করতে পারেন EntityManagerInterface $entityManagerএবং তারপরে কল করতে পারেন$entityManager->getConnection()
Coil

50
//$sql - sql statement
//$em - entity manager

$em->getConnection()->exec( $sql );

20
এছাড়াও এক্সিকিউটের পরিবর্তে প্রস্তুতি () কল করা ভাল ধারণা যাতে আপনি এখনও প্রস্তুত বিবৃতি সমর্থন পেতে পারেন।
জেরেমি হিক্স

45

আমি পিডিও ব্যবহার করছি বলে ধরে নিলাম এটি করে এটি কাজ করেছিলাম।

//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 পরিবর্তন করতে পারেন।


4
এগুলির সর্বোত্তম উদাহরণ
ডেভিড

14

কীভাবে কোনও কাঁচা ক্যুরিয় চালানো যায় এবং ডেটা ফেরত দেওয়া যায়।

আপনার ম্যানেজারের দিকে নজর দিন এবং একটি নতুন সংযোগ করুন:

$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();

আপনার ক্যোয়ারী তৈরি করুন এবং সমস্ত আনুন:

$result= $conn->query('select foobar from mytable')->fetchAll();

ফলাফলের মতো ডেটা এইভাবে পান:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);

4
এসকিউএল যখন আপনি ব্যবহার করতে চান এমন কিছু ডেটা ফেরত দেয় তখন কোয়েরি () হয়; এক্সিকিউট () কখন হয় না এর জন্য
জেফিকিনস

12

আমি উত্তরটি সম্ভবত খুঁজে পেয়েছি:

একটি নেটিভিকুয়েরি আপনাকে আপনার স্পেসিফিকেশন অনুসারে ফলাফল ম্যাপিংয়ে নেটিভ এসকিউএল কার্যকর করতে দেয়। এই জাতীয় স্পেসিফিকেশন যা বর্ণনা করে যে কোনও এসকিউএল ফলাফল সেট কীভাবে একটি মতবাদ ফলাফলের সাথে ম্যাপ করা হয় তাকে রেজাল্টসেটম্যাপিং দ্বারা উপস্থাপন করা হয়।

উত্স: নেটিভ এসকিউএল


17
এটি স্বীকৃত উত্তর তবে আমি এখনও দেখছি না যে মতবাদের এই অংশটি কীভাবে কার্যকর হয় কারণ আপনার সর্বদা রেজাল্টসেটম্যাপিং প্রয়োজন। আমি এটি সত্তাগুলির কাছে ফলাফলগুলি মানচিত্র করাতে চাই না .... যা নির্বিচারে এসকিউএল চালানোর পয়েন্টটিকে ডিফল্ট করে!
মাইকমুরকো

4
@ মাইকমুরকো এই পোস্টটি আমি মতবাদ 2: ফোরাম.সাইমফনি
জেসন সোয়েট

এছাড়াও অ-নেটিভ নেটিভ এসকিউএল প্রতিটি সম্ভাব্য এসকিউএল কোয়েরি কার্যকর করে না। মোছা / আপডেট / INSERT অভ্যাস কাজ করবে না, বা এমন কিছু টেবিল সংজ্ঞা যা মতবাদ অনুমানগুলি অনুসরণ করে না। (এম 2 এম আইডি ছাড়াই টেবিলে যোগদান করুন)। সুতরাং এই উত্তর সর্বজনীন নয়। তেমনি INSERTs কাজ করবে না হিসাবে গ্রহণ করা উচিত।
przemo_li

5

আমারও একই সমস্যা ছিল। আপনি সত্তা পরিচালক দ্বারা সরবরাহিত সংযোগ অবজেক্টটি দেখতে চান:

$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 এ সংযোগ বস্তুর জন্য ডকগুলি দেখুন


5

আপনার মডেলটিতে কাঁচা এসকিউএল স্টেটমেন্ট তৈরি করুন (নীচে উদাহরণস্বরূপ আমাকে ব্যবহার করতে হবে এমন একটি তারিখের অন্তর্ভুক্তের উদাহরণ রয়েছে তবে আপনার নিজের বিকল্প প্রতিস্থাপন করুন you আপনি যদি একটি নির্বাচন করছেন তবে>> এক্সিকিউট () কলটিতে ফেচেল যোগ করুন)।

   $sql = "DELETE FROM tmp 
            WHERE lastedit + INTERVAL '5 minute' < NOW() ";

    $stmt = $this->getServiceLocator()
                 ->get('Doctrine\ORM\EntityManager')
                 ->getConnection()
                 ->prepare($sql);

    $stmt->execute();

4

আপনি পারবেন না, মতবাদ 2 কাঁচা প্রশ্নের জন্য অনুমতি দেয় না। আপনি এটি করতে পারেন মনে হতে পারে তবে আপনি যদি এরকম কিছু চেষ্টা করেন:

$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);

মতবাদ একটি ত্রুটি ছুঁড়ে মারবে বলে যে DATE_FORMAT একটি অজানা ফাংশন।

তবে আমার ডাটাবেসটি (মাইএসকিএল) সেই ফাংশনটি জানে, তাই মূলত যা হ্যাপেন হচ্ছে তা হ'ল ডক্ট্রাইন সেই জিজ্ঞাসাকে পর্দার পিছনে (এবং আপনার পিছনের পিছনে) বিশ্লেষণ করছে এবং কোয়েরিটিকে অবৈধ বলে বিবেচনা করে এটি বোঝে না এমন একটি অভিব্যক্তি খুঁজে পাচ্ছে।

সুতরাং যদি আমার মতো আপনি কেবল ডেটাবেজে একটি স্ট্রিং প্রেরণ করতে সক্ষম হন এবং এটি এটির সাথে মোকাবিলা করতে দিন (এবং বিকাশকারীকে সুরক্ষার জন্য পুরো দায়িত্ব নিতে দিন), এটি ভুলে যান।

অবশ্যই আপনি কোনও বা কোনও উপায়ে এটির অনুমতি দেওয়ার জন্য একটি এক্সটেনশনের কোড করতে পারেন, তবে আপনি এটি করার জন্য মাইসকিলি ব্যবহার করে বন্ধ করে দিয়েছেন এবং মতবাদকে এটি ওআরএম বয়েসনে ছেড়ে চলেছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.