মতবাদ 2 সহ কীভাবে ব্যবহার করবেন


124

আমার কাছে নিম্নলিখিত কোড রয়েছে যা আমাকে ত্রুটি দেয়:

Message: Invalid parameter number: number of bound variables does not match number of tokens 

কোড:

public function getCount($ids, $outcome)
{
    if (!is_array($ids)) {
        $ids = array($ids);
    }
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->add('select', $qb->expr()->count('r.id'))
       ->add('from', '\My\Entity\Rating r');
    if ($outcome === 'wins') { 
        $qb->add('where', $qb->expr()->in('r.winner', array('?1')));
    }
    if ($outcome === 'fails') {
        $qb->add('where', $qb->expr()->in('r.loser', array('?1')));
    }
    $qb->setParameter(1, $ids);
    $query = $qb->getQuery();
    //die('q = ' . $qb);
    return $query->getSingleScalarResult();
}

ডেটা (বা ids আইডিস):

Array
(
    [0] => 566
    [1] => 569
    [2] => 571
)

ডিকিউএল ফলাফল:

q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')

উত্তর:


114

এই সমস্যাটি অনুসন্ধান করার সময়, আমি এমন একটি জিনিস পেয়েছি যা এই একই সমস্যাটির জন্য চালিত এবং সমাধানের সন্ধানের জন্য গুরুত্বপূর্ণ হবে।

মূল পোস্ট থেকে নিম্নলিখিত কোডের লাইন:

$qb->add('where', $qb->expr()->in('r.winner', array('?1')));

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

$qb->add('where', $qb->expr()->in('r.winner', '?1'));

এই সমস্যাটি স্থির করা উচিত। এটি ডক্ট্রিনের পূর্ববর্তী সংস্করণগুলিতে সমস্যা হতে পারে তবে এটি 2.0 এর সাম্প্রতিক সংস্করণে স্থির করা হয়েছে।


5
আমি মনে করি $qb->expr()->in()কেবলমাত্র মতবাদ 2 ওআরএম-এ রয়েছে, তবে ডক্ট্রিন ডিবিএলে নয় in
মার্টিন

3
$qb->expr()->in()সত্যই ডিবিএল
জেমসহালসাল

343

এটি করার সহজতম উপায় হ'ল অ্যারেটিকে প্যারামিটার হিসাবে আবদ্ধ করে রাখা:

$queryBuilder->andWhere('r.winner IN (:ids)')
             ->setParameter('ids', $ids);

41
কেবলমাত্র নয় তবে ২.১ থেকে শুরু হচ্ছে
ম্যাকিয়েজ পাইজাইস্কি

7
@ MaciejPyszyński +1। সবচেয়ে সহজ উপায়গুলি প্রায়শই সেরা!
আন্দ্রেজেজ ওমিয়াওভস্কি

2
দ্রুত উল্লেখ: এটি -> সেটপ্যারামিটার ('আইডস', $ আইডি) দিয়ে ডিফল্ট হিসাবে কাজ করে তবে -> সেটপ্যারামিটারগুলি ('আইডস' => $ আইডি) দিয়ে নয় ids আমাকে ডিবাগ করার কয়েক মিনিট সময় নিয়েছে।
ল্যারিডাহোস্টার

3
তৈরি করা -> সেটপ্যারামিটারগুলি (...) ->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
জর্জ মেলোনাস

5
আমি setParameterবল প্রয়োগ করতে 3 Connection::PARAM_STR_ARRAY
র্থ

58

এবং সম্পূর্ণ করার জন্য স্ট্রিং সমাধান

$qb->andWhere('foo.field IN (:string)');
$qb->setParameter('string', array('foo', 'bar'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);

অবশ্যই আমার জন্য সেরা সমাধান :-)
ফ্রান্সেসকো ক্যাসুলা

3
আপনার যদি স্ট্রিং না করে পূর্ণসংখ্যার অ্যারে থাকে তবে \ মতবাদ \ ডিবিএল \ সংযোগ :: PARAM_INT_ARRAY ব্যবহার করতে পারেন।
15:30


12

আমি জানি এটি একটি পুরানো পোস্ট তবে কারও পক্ষে সহায়ক হতে পারে। আমি ড্যানিয়েল এসপেনডিলারের উত্তরটি ইনট সম্পর্কিত মন্তব্যগুলিতে জিজ্ঞাসা করা প্রশ্নে সম্বোধন করে ভোট দিয়ে বাড়াতে চাই

এই কাজটি ইন্টের জন্য যথাযথ উপায়ে তৈরি করতে, অ্যারের মানগুলি টাইপ ইন্টের মতো তা নিশ্চিত করুন, আপনি পাশ করার আগে ইন্টার-এ কাস্ট টাইপ করতে পারেন ...

 $qb->andWhere('foo.field IN (:ints)');
 $qb->setParameter('ints', array(1, 2), 
 \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

সিমফনি ৩.৪ এবং মতবাদ-বান্ডেলে নির্বাচন / মোছার জন্য পরীক্ষিত: 1.8


8

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

আপনি WHERE INনিয়ামকের কাছ থেকেও এইভাবে কিছু করতে পারেন :

// Symfony example
$ids    = [1, 2, 3, 4];
$repo   = $this->getDoctrine()->getRepository('AppBundle:RepoName');
$result = $repo->findBy([
    'id' => $ids
]);

1
এটি ডিকিউএল ব্যবহার না করেই এমন কোনও উপায়ে গ্রহণযোগ্য উপায়, তবে তার প্রশ্নটি ছিল তার ডিকিউএল কোডের প্রসঙ্গে। তিনি এই আইডির উপর ভিত্তি করে আমাকে সমস্ত কিছু দেওয়ার চেয়ে সহজ কিছু করছেন না।
spetz83

6

এটি করার সর্বোত্তম উপায় - বিশেষত যদি আপনি একাধিক শর্ত যুক্ত করেন তবে তা হ'ল:

$values = array(...); // array of your values
$qb->andWhere('where', $qb->expr()->in('r.winner', $values));

যদি আপনার মানের অ্যারেগুলিতে স্ট্রিং থাকে তবে আপনি ইমপ্লোড স্ট্রিং সহ সেটপ্যারামিটার পদ্ধতিটি ব্যবহার করতে পারবেন না, কারণ আপনার উদ্ধৃতিগুলি অব্যাহতিপ্রাপ্ত হবে!


6

আমি এটি এইভাবে ব্যবহার করেছি:

->where('b.status IN (:statuses)')
->setParameters([
                'customerId' => $customerId,
                'storeId'    => $storeId,
                'statuses'   => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED]
            ]);

5

এটি 2016 সালে কীভাবে করবেন তা পাওয়া গেছে: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/

উদ্ধৃতি:

এটি সঠিকভাবে কীভাবে করা যায় তা এখানে:

$em->createQuery(“SELECT users 
     FROM Entities\User users 
     WHERE 
         users.id IN (:userids)”)
->setParameters(
     array(‘userids => $userIds)
);

পদ্ধতিটি setParametersপ্রদত্ত অ্যারে নেবে এবং সঠিকভাবে "IN" স্টেটমেন্টে ব্যবহার করতে হবে l


2
এটি আমার সমস্যার সমাধান করেছে (চারপাশের প্রথম বন্ধনীগুলি :userids)
মিহাই রুরাকানু

2

আমি পছন্দ করি:

$qb->andWhere($qb->expr()->in('t.user_role_id', [
    User::USER_ROLE_ID_ADVERTISER,
    User::USER_ROLE_ID_MANAGER,
]));

0
->where($qb->expr()->in('foo.bar', ':data'))
            ->setParameter('participants', $data);

এর সাথেও কাজ করে:

 ->andWhere($qb->expr()->in('foo.bar', ':users'))
                ->setParameter('data', $data);

0

আমি এই একই দৃশ্যের সাথে লড়াই করেছি যেখানে আমাকে মূল্যবোধের অ্যারের বিরুদ্ধে একটি জিজ্ঞাসা করতে হয়েছিল।

নিম্নলিখিত আমার জন্য কাজ করেছে:

http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause

->andWhereIn("[fieldname]", [array[]])

অ্যারের ডেটা উদাহরণ (স্ট্রিং এবং পূর্ণসংখ্যার সাথে কাজ করা):

$ids = array(1, 2, 3, 4);

প্রশ্নের উদাহরণ (আপনার যেখানে প্রয়োজন সেখানে খাপ খাইয়ে নিন):

$q = dataTable::getInstance()
    ->createQuery()
    ->where("name = ?",'John')
    ->andWhereIn("image_id", $ids)
    ->orderBy('date_created ASC')
    ->limit(100);

$q->execute();

0

এই বছর পরে, একটি উত্তরাধিকার সাইটে কাজ করা ... আমার জীবনের জন্য আমি ->andWhere()বা পেতে পারেন না->expr()->in() কাজ সমাধান কাজ ।

অবশেষে ডক্ট্রিন মংডোডব-ওডব রেপোতে সন্ধান করল এবং কয়েকটি অত্যন্ত উদ্ঘাটিত পরীক্ষার সন্ধান পেল:

public function testQueryWhereIn()
{ 
  $qb = $this->dm->createQueryBuilder('Documents\User');
  $choices = array('a', 'b');
  $qb->field('username')->in($choices);
  $expected = [
    'username' => ['$in' => $choices],
  ];
  $this->assertSame($expected, $qb->getQueryArray());
}

এটা আমার জন্য কাজ!

আপনি গিথুব এ পরীক্ষাগুলি এখানে পেতে পারেন । সব ধরণের বাজে কথা স্পষ্ট করার জন্য কার্যকর।

দ্রষ্টব্য: আমার সেটআপটি আমি যতটা করতে পারি তত্ক্ষণাত মংগোডিবি ওডিএম v1.0.dev ব্যবহার করছি।

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