كيف يمكنني كتابة عدد SQL مع جملة عن طريق جملة باستخدام Propel Orm في Symfony؟

StackOverflow https://stackoverflow.com/questions/933473

  •  06-09-2019
  •  | 
  •  

سؤال

كيف يمكنني كتابة استعلام SQL التالي باستخدام Propel Orm؟

SELECT species, COUNT(*) FROM Bird GROUP BY species;

لا يوجد حل صحيح

نصائح أخرى

هذا ليس استعلام من شأنه أن يؤدي إلى مرطب ذات مغزى Bird الكائنات، لأنك فقط حدد species العمود وعدد تلك الأنواع. وبالتالي استفسار SQL "الخام" كما اقترح كولن ربما أفضل طريقة للذهاب هنا - ولكن لا ترطيب في النهاية، فقط احصل على البيانات من الناتجة PDOStatement.

إذا species كان إشارة إلى Species الجدول، يمكنك العمل من هناك: هيدرات Species الكائنات، مع عمود إضافي مهمات الطيور لكل نوع. إذا كنت تستخدم Symfony حتى الإصدار 1.2، أوصي بشدة DBFinder البرنامج المساعد, ، كما يبسط بشكل كبير العمل مع Criteria, وله طرق لتحديد عمود إضافي واحد:

$speciesQuery = DbFinder::from('Species')->
  join('Bird')->
  groupBy('Bird.Id')->
  withColumn('COUNT(Bird.Id)', 'NbBirds');

foreach ($speciesQuery->find() as $species) {
  echo $species->getName() . ": " . $species->getNbBirds() . " birds\n";
}

إذا كنت تستخدم Symfony 1.3 أو 1.4، فيجب عليك ترقية Propel 1.4 المجمعة لدفع 1.5، حيث يقوم François Zaniotto، خالق DBFinder، جزءا كبيرا من وظائفه وأضاف المزيد، لذلك يعمل الرمز أعلاه في دفع 1.5 دون مكون إضافي.

$c = new Criteria();
$c->addAsColumn('cnt', "count(*)");
self::addSelectColumns($c);
$c->addGroupByColumn(BirdPeer::SPECIES);

ولكن سوف تحتاج إلى القيام براءة مخصصة إذا كنت بحاجة إلى الحصول على عدد (*) إلى كائناتك المأهولة.

لقد وجدت صعوبة في العثور على وثيقة واحدة على معايير الدفع (لا يبدو أن هناك وثيقة API عليها) لذلك عادة ما أستخدم القائمة في الفصل 8 من دفتر Symfony؛ ولكن ليس لدي أي فكرة عما إذا كانت هذه شاملة أم لا.

ولكن ما يمكنك القيام به هو إطعام SQL مباشرة إلى الدفع. تم تعديل ما يلي من مثال http://propel.phpdb.org/docs/user_guide/chapters/findingoBjects.html.:

    $con = Propel::getConnection(DATABASE_NAME);

    // if not using a driver that supports sub-selects
    // you must do a cross join (left join w/ NULL)
    $sql = "SELECT species, COUNT(*) FROM Bird GROUP BY species";

    $stmt = $con->createStatement();
    $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);

    return parent::populateObjects($rs);

لا أعتقد أنني استخدمت به بهذه الطريقة بنفس الطريقة، على الرغم من أنني قد يكون لدي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top