কীভাবে সন্ধান করবেন সমস্ত ডক্ট্রিনের পদ্ধতি


111

আমি ডক্ট্রিনের ডকুমেন্টেশন পড়ছি, তবে আমি অনুসন্ধানের সমস্ত () ফলাফলগুলি বাছাই করার উপায় খুঁজে পাইনি।

আমি symfony2 + মতবাদ ব্যবহার করছি, এটি আমার কন্ট্রোলারের অভ্যন্তরে আমি এই বিবৃতিটি ব্যবহার করছি:

$this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll();

তবে আমি চাই ফলাফলগুলি আরোহী ব্যবহারকারীর নাম দ্বারা অর্ডার করা হোক।

আমি এইভাবে একটি অ্যারেটি আর্গুমেন্ট হিসাবে পাস করার চেষ্টা করেছি:

findAll( array('username' => 'ASC') );

তবে এটি কাজ করে না (এটি কোনও অভিযোগও করে না)।

ডিকিউএল কোয়েরি না করে এটি করার কোনও উপায় আছে কি?

উত্তর:


229

@ লাইটহার্ট হিসাবে দেখানো হয়েছে, হ্যাঁ এটি সম্ভব, যদিও এটি নিয়ামককে উল্লেখযোগ্য পরিমাণে ফ্যাট যুক্ত করে এবং শুকানো হয় না।

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

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
    public function findAll()
    {
        return $this->findBy(array(), array('username' => 'ASC'));
    }
}

তারপরে অবশ্যই আপনার সত্তাকে অবশ্যই সংগ্রহস্থলের অনুসন্ধানগুলি অনুসন্ধান করতে বলুন:

/**
 * @ORM\Table(name="User")
 * @ORM\Entity(repositoryClass="Acme\UserBundle\Entity\Repository\UserRepository")
 */
class User
{
    ...
}

অবশেষে, আপনার নিয়ামক:

$this->getDoctrine()->getRepository('AcmeBundle:User')->findAll();

2
এটি আমার চেয়ে ভাল পন্থা, তবে আপনি dql লিখবেন; আমার পদ্ধতিতে কম dql রয়েছে এবং তাই ওপি'র সীমাবদ্ধতার উত্তর দেয়। স্পষ্টতই, dql এর ভয়কে কাটিয়ে উঠতে হবে। আমার পক্ষে যদি সম্ভব হয় তবে এই পদ্ধতিটি ব্যবহার করুন।
লাইটহার্ট

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

1
বা সহজভাবে: $ এটি-> getDoctrine () -> getRepository ('একেমবান্ডেল: ব্যবহারকারী') -> FindBy (অ্যারে (), অ্যারে ('ব্যবহারকারীর নাম' => 'ASC'));
বেনজি_এক্স 80

1
@ বেনজি_এক্স 80 যদিও ওয়ান-লাইনারটি অবশ্যই খাটো, এটি মোটেও শুকনো নয়। সন্ধানের সমস্ত পদ্ধতি নিয়ন্ত্রকের নয়, সংগ্রহস্থলের অন্তর্ভুক্ত।
পিয়র-লাক জেন্ডারউ

1
আপনি কি সত্তাকে মন্তব্য ব্যবহারের পরিবর্তে অন্য কোনও উপায়ে কাস্টম সংগ্রহস্থলে অনুসন্ধানগুলি অনুসন্ধান করতে বলতে পারেন? এটি আমার মধ্যে দেখা সবচেয়ে ভয়ঙ্কর প্রোগ্রামিং অনুশীলন
সেজানুস

81
$this->getDoctrine()->getRepository('MyBundle:MyTable')->findBy([], ['username' => 'ASC']);


20

এটি কখনও কখনও উত্স কোডটি দেখতে দরকারী useful

উদাহরণস্বরূপ findAllবাস্তবায়ন খুব সহজ ( vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php):

public function findAll()
{
    return $this->findBy(array());
}

সুতরাং আমরা findByআমাদের যা প্রয়োজন তা দেখি এবং খুঁজে পাই ( orderBy)

public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)

6

এটি আমার পক্ষে কাজ করে:

$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(),array('name' => 'ASC'));

প্রথম অ্যারেটি খালি ফিরিয়ে নিয়ে যাওয়া সমস্ত ডেটা রেখে, এটি আমার ক্ষেত্রে কাজ করেছে।



5

আপনার একটি মানদণ্ড ব্যবহার করা দরকার, উদাহরণস্বরূপ:

<?php

namespace Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Collections\Criteria;

/**
* Thing controller
*/
class ThingController extends Controller
{
    public function thingsAction(Request $request, $id)
    {
        $ids=explode(',',$id);
        $criteria = new Criteria(null, <<DQL ordering expression>>, null, null );

        $rep    = $this->getDoctrine()->getManager()->getRepository('Bundle:Thing');
        $things = $rep->matching($criteria);
        return $this->render('Bundle:Thing:things.html.twig', [
            'entities' => $things,
        ]);
    }
}

4

সিমফোনিতে FindBy পদ্ধতি দুটি পরামিতি বাদ দেয়। প্রথমটি আপনি যে ক্ষেত্রগুলির সন্ধান করতে চান তার অ্যারে এবং দ্বিতীয় অ্যারেটি হল সাজানো ক্ষেত্র এবং তার ক্রম

public function findSorted()
    {
        return $this->findBy(['name'=>'Jhon'], ['date'=>'DESC']);
    }

আপনি আপনার খুব সংক্ষিপ্ত উত্তরে কিছু ব্যাখ্যা যোগ করতে পারেন?
নিকো হায়েস

এটি একটি শক্তিশালী সংক্ষিপ্ত উত্তর। বিস্তারিত - ব্যাখ্যা করুন ... সম্পাদনা করুন
পল হেজস

এটাই ছিল সঠিক উত্তর! ফাইন্ডবাই (অ্যারে (), অ্যারে ('ফিল্ড নেম' => 'এএসসি') এটি সমস্ত খুঁজে পাবেন এবং নির্দেশিত নির্দেশের সাথে ক্ষেত্রের মধ্যে বাছাই করুন
রবার্ট সায়লর ২

2

আপনি একটি অ্যারে পুনরুক্তিকারী ব্যবহার করে একটি বিদ্যমান অ্যারে সংগ্রহটি বাছাই করতে পারেন।

ধরে নিচ্ছি $ সংগ্রহটি আপনার অ্যারের সংগ্রহটি ফাইন্ডএল দ্বারা ফিরে এসেছে ()

$iterator = $collection->getIterator();
$iterator->uasort(function ($a, $b) {
    return ($a->getPropery() < $b->getProperty()) ? -1 : 1;
});
$collection = new ArrayCollection(iterator_to_array($iterator));

এটি সহজেই একটি ফাংশনে রূপান্তরিত হতে পারে ফাইন্ডএলঅর্ডারবি () পদ্ধতিটি তৈরি করতে আপনি আপনার সংগ্রহশালায় রাখতে পারেন।


4
এখানে আপনার বক্তব্য কি? এর জন্য পর্যাপ্ত ব্যবহারের চেয়েও বেশি কেস রয়েছে ... যেমন পিএইচপি-তে ইতিমধ্যে সংগ্রহ করা বাছাই করা বাছাইয়ের জন্য অন্য কোনও মাইএসকিএল ক্যোয়ারী সম্পাদন করার চেয়ে সবসময় দ্রুত হয়! কল্পনা করুন যে আপনার এক পৃষ্ঠায় দুটি পৃথক বাছাই করার শৈলীতে একই সংগ্রহের ডেটা আউটপুট করা দরকার ...
নিকোলাই ফ্রিলিক

2
সাধারণভাবে, আদেশযুক্ত ক্যোয়ারী ফিরিয়ে নেওয়া উচিত ডাটাবেসের কাজ। ওও, এই কৌশলটির আরও জড়িত মামলার ক্ষেত্রে প্রযোজ্যতা থাকতে পারে if
লাইটহার্ট

2

এটা চেষ্টা কর:

$em = $this->getDoctrine()->getManager();

$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(), array('username' => 'ASC'));

1

আমি nifr লিখেছেন যে সমাধান একটি বিকল্প ব্যবহার।

$resultRows = $repository->fetchAll();
uasort($resultRows, function($a, $b){
    if ($a->getProperty() == $b->getProperty()) {
        return 0;
    }
    return ($a->getProperty()< $b->getProperty()) ? -1 : 1;
});

এটি অর্ডার বাই দফাটির চেয়ে দ্রুত এবং আইট্রেটারের ওভারহেড ছাড়াই


আপনার উত্তরে আরও কিছু ব্যাখ্যা যুক্ত করুন। কীভাবে আপনার অ্যাপ্লিকেশনটি বাছাই করা ডাটাবেস স্তরে করার চেয়ে দ্রুত হতে পারে?
নিকো হেসে

0

এন্টিরিওপোসিটোরিতে ডিফল্ট ফাইন্ডএল ফাংশনটি এর মতো করুন:

public function findAll( array $orderBy = null )
{
    return $this->findBy([], $orderBy);
}

এইভাবে আপনি কোয়েরিতে বাছাইয়ের বিকল্প সহ কোনও ডেটা টেবিলের জন্য যে কোনও প্রশ্নের উপরে '' FindAll '' ব্যবহার করতে পারেন

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