মতবাদ dql ক্যোয়ারী ফলাফল হিসাবে একটি মাত্রিক স্কেলার অ্যারে কিভাবে পাবেন?


116

আমি নিলাম টেবিলের আইডি কলাম থেকে মানগুলির একটি অ্যারে পেতে চাই। এটি যদি কোনও কাঁচা এসকিউএল হয় তবে আমি লিখতাম:

SELECT id FROM auction

তবে আমি যখন এটি মতবাদে করি এবং সম্পাদন করি:

$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); 

আমি এর মতো একটি অ্যারে পাই:

array(
    array('id' => 1),
    array('id' => 2),
)

পরিবর্তে, আমি এই জাতীয় একটি অ্যারে পেতে চাই:

array(
    1,
    2
)

আমি কীভাবে এটি মতবাদ ব্যবহার করে করতে পারি?

উত্তর:


197

পিএইচপি <5.5

আপনি ব্যবহার করতে পারেন array_mapএবং যেহেতু আপনি শুধুমাত্র অ্যারের প্রতি আইটেমের উপর আছে, তবে আপনি এইরূপ সূচারূভাবে ব্যবহার করতে পারেন 'current'কলব্যাক হিসাবে, এর পরিবর্তে একটি লেখার অবসান

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_map('current', $result);

দেখুন নিচের পেত্র Sobotka, এর উত্তর মেমোরি ব্যবহার সংক্রান্ত অতিরিক্ত তথ্যের জন্য।

পিএইচপি> = 5.5

নীচে jcbwlkr এর উত্তর হিসাবে , এটি ব্যবহারের প্রস্তাবিত উপায় array_column


9
getScalarResult () আপনার স্ট্রিং দেব - ব্যবহারের getArrayResult () যদি আপনি পূর্ণসংখ্যার চান
pHoutved

তাই! মেমরি পরিচালনায় অ্যারে_ কলাম () আরও ভাল বা এটি ফোরচ পদ্ধতিতে কী করা যায়?
ধীররাজ


98

একটি ভাল সমাধান ব্যবহার করা হয় PDO:FETCH_COLUMN। এটি করার জন্য আপনার একটি কাস্টম জলবাহক প্রয়োজন:

//MyProject/Hydrators/ColumnHydrator.php
namespace DoctrineExtensions\Hydrators\Mysql;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator, PDO;

class ColumnHydrator extends AbstractHydrator
{
    protected function hydrateAllData()
    {
        return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
    }
}

এটিকে মতবাদে যুক্ত করুন:

$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProject\Hydrators\ColumnHydrator');

এবং আপনি এটি ব্যবহার করতে পারেন:

$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");

আরও তথ্য: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/references/dql-doctrine-query-language.html#custom-hydration-modes


2
আমি এটি সংশোধন করেছি তাই এটি সূচককে সমর্থন করে gist.github.com/ostrolucky/f9f1e0b271357573fde55b7a2ba91a32
গাদেলাট

18

Ascarius এর উত্তর মার্জিত, কিন্তু মেমরির ব্যবহার থেকে সাবধান! array_map()পাস করা অ্যারের একটি অনুলিপি তৈরি করে এবং কার্যকরভাবে মেমরির ব্যবহার দ্বিগুণ করে। আপনি কয়েক হাজার অ্যারে আইটেম নিয়ে কাজ করলে এটি একটি সমস্যা হয়ে উঠতে পারে। যেহেতু রেফারেন্স অনুসারে পিএইচপি 5.4 কল-টাইম পাসটি সরানো হয়েছে তাই আপনি করতে পারবেন না

// note the ampersand
$ids = array_map('current', &$result);

সেক্ষেত্রে আপনি স্পষ্টতই যেতে পারেন

$ids = array();
foreach($result as $item) {
  $ids[] = $item['id'];
}

2
এটি কিছুটা স্ব-স্বজ্ঞাত বলে মনে হয়েছিল, যেহেতু আমাদের লক্ষ্য উভয় ক্ষেত্রে অ্যারে "প্রায় অনুলিপি করা"। এটি সত্য সত্য তা নিশ্চিত হওয়ার জন্য আমাকে এটি পরীক্ষা করতে হয়েছিল: gist.github.com/PowerKiKi/9571aea8fa8d6160955f
পাওয়ারকিকি

4

আমি মনে করি এটি মতবাদে অসম্ভব। আপনি পিএইচপি ব্যবহার করতে চান এমন ফলাফলের অ্যারেটিকে কেবলমাত্র তথ্যের কাঠামোর মধ্যে রূপান্তর করুন:

$transform = function($item) {
    return $item['id'];
};
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.