ترقيم الصفحات مع Hasmany Association Cakephp
-
22-09-2019 - |
سؤال
انا لدي طاولتان:
المتسابق والمتسابق أصوات 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...
}