سؤال

انا لدي طاولتان:

المتسابق والمتسابق أصوات Hasmany

لقد حاولت القيام بعد (تصويت. لقد فعلت ذلك في مجموعة الحقول ، لكنه أعطاني العدد الكلي للأصوات بغض النظر عن المتسابق الذي ينتمون إليه.

يتم ربط الأصوات معًا في مجموعة سجلات المتسابقين ، لذا فإن ما فعلته هو رأيي ، لقد قمت بعمل عد (متسابق $ [التصويت]) ولكن لا يمكن ربط هذا ويريد موكلي أن يكون قادرًا على فرز المتسابقين عن طريق الأصوات.

هل هناك طريقة يمكنني أن أفعل شيئًا كهذا في رأيي؟:

فرز ("الأصوات" ، "العد (التصويت)") ؛ ؟>

أو هل يجب علي إنشاء استعلام يقوم بالعد لجميع الأصوات حيث المتسابق.

متسابق وحدة التحكم:

function index() {
            $page = 'Contestants';
            $this->set('page', $page);
            $this->paginate =
            array(
                    'order' => 'id ASC',
                    'contain' => array(
                            'Vote' => array(
                                    'fields' => array("Vote.contestant_id",'Vote.id')
                            )
                    )
            $conditions ["Contestant.active"] = 1;
            $this->set('contestants', $this->paginate('Contestant',

$ ظروف)) ؛ }

هل كانت مفيدة؟

المحلول 2

نظرًا لأن CakePhP لا يدعم المجموعة من خلال سلوك قابل للاحتواء ، فقد جربت نهجًا مختلفًا. قم بإنشاء FAGE FAR لنموذج التصويت بدلاً من ذلك (يتم كل هذا في وحدة تحكم المتسابقين):

var $paginate = array(
    'Vote'=>array(
        'limit'=>5,
        'fields' => array(
        'Contestant.*, count(Vote.contestant_id) as Contestant_votes, Vote.id'
        ),
        'group' => array(
        'Vote.contestant_id'
        ),
        'order' => array(
        'Contestant_votes Desc'
        )
    ),
    'Contestant'=>array(
        'limit'=>5,
        'order' => array(
        'Contestant.id Desc'
        )
    )
);

والآن في وحدة التحكم الخاصة بي أفعل ما يلي:

function index() {
    $page = 'Contestants';
    $this->set('page', $page);  
    $conditions ["Contestant.active"] = 1;
    $this->set('contestants', $this->paginate($this->Contestant->Vote,$conditions));
}

الآن يتم طلب المتسابقين من خلال إجمالي تصويتهم ، على الرغم من أنني ما زلت لا أستطيع تحديد كيفية وضع المتسابق _votes كمتغير paginator لأنه في السجل المحدد في صفيف خاص به وليس في أي من صفائف النماذج المستخدمة في التراجع .

شكرا مات هوجينز ، كان نهجك هو الذي قادني إلى هذا الحل.

نصائح أخرى

تحقق من رد Deflesze في هذا السؤال: حقل حصر الرياضيات Cakephp؟

في الأساس تريد أن تفعل شيئًا كهذا أظن:

'contain' => array(
    'Vote' => array(
        'fields' => array('SUM(Vote.id) AS Contestant__votes'),
        'group'  => array('Vote.contestant_id'),
    )
)

بالإضافة إلى ذلك: هل تريد أيضًا الفرز عن طريق الأصوات (إجمالي الأصوات) تصاعديًا أو تنازليًا؟ إذا كانت الإجابة بنعم ، لا يمكنك القيام بذلك بسهولة عن طريق ترقيم الصفحات الافتراضي لـ CakePhP.

لذلك تحتاج إلى القليل من التعديل. هذه تفاصيل حول هذه الخدعة: CakePhp Advanced Pagination - الفرز حسب الحقل المشتق

آمل أن تجدها مفيدة.

شكرا عدنان

بالنسبة للعلاقة المحددة التي تحددها ، يتم تقديم احتياجاتك بشكل جيد مضاد.

ستحتاج إلى تحديد حقل جديد في contestants الطاولة: vote_count. ثم ، في نموذج الأصوات ، ستحتاج إلى تحديث $belongsTo التعريف قليلاً:

class Votes extends AppModel
{
    var $belongsTo = array(
        'Contestant' => array( 'counterCache' => true )
    );
}

الآن ، في أي وقت يتم فيه حفظ سجل التصويت ، vote_count سيتم تحديث مجال المتسابق الوالد. الآن يمكنك ببساطة الفرز Contestant.vote_count كما تفعل مع أي مجال متسابق آخر:

class ContestantsController extends AppController
{
    // Controller stuff that comes before...

    function index()
    {
        $this->paginate = array( 'Contestant' => array(
            'conditions' => array( 'Contestant.active' => 1 ),
            'order' => array( 'Contestant.vote_count' => 'DESC' ),
        ));

        $contestants = $this->paginate('Contestants');

        $this->set( compact('contestants'));
    }

    // Controller stuff that comes after...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top