سؤال

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

    $posts = $this->select()->setIntegrityCheck(false)
                        ->from(array('post' => 'Posts'), array('*'))
                        ->where('post.idGroup = ' . $idGroup)
                        ->where('post.idTopic IS NULL')
                        ->order('post.date DESC')
                        ->limit($resultsPerPage, $resultsPerPage * ($page - 1))
                        ->joinLeft(array('user' => 'Users'), 'post.idUser = user.idUser', 
                            array('idUser', 'fname', 'lname', 'profileUrl', 'photoUrl'))
                        ->joinLeft(array('comment' => 'Posts'), 'comment.idTopic = post.idPost')
                        ->query()->fetchAll();

المشكلة هي أن المصفوفة الناتجة مسطحة وأن بيانات التعليق تحل محل بيانات النشر، وهذا مثال على ما تم إرجاعه:

[1] => Array
    (
        [idPost] => 13
        [idTopic] => 11
        [idGroup] => 1
        [idUser] => 84
        [postContent] => Hello my name is Mud.
        [postUrl] => 13/hello-my-name-is-mud
        [postVotes] => 
        [postScore] => 
        [date] => 2009-07-21 16:39:09
        [fname] => John
        [lname] => Doe
        [profileUrl] => john-doe
        [photoUrl] => uploads/userprofiles/0/84/pic84_14
    )

ما نود أن تكون النتيجة هو شيء مثل هذا:

    [1] => array(
            [post] => array(
                [0] => array(
                    idPost => 12,
                    postContent => This is a post...,
                    idGroup => 1
                    ...
                )
            ),
            [user] => array(
                [0] => array(
                    userName => JohnDoe
                    ...
                    )
                ),
            [comments] => array(
                [0] => array(
                    idPost => 15,
                    postContent => This is a comment...,
                    idGroup => 1
                    ...
                ),
                [1] => array(
                    idPost => 17,
                    postContent => This is another comment...,
                    idGroup => 1
                    ...
                )
            )
        )

أي تلميحات لحلول أخرى هي أيضا موضع ترحيب كبير.

شكرًا.

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

المحلول

إذا قمت بتسمية جميع الأعمدة في الرابط الثاني بالمشاركات (مثل idPost كـ Child_idPost...إلخ)، فستحصل على العديد من الصفوف التي هي الصف الأصلي مع أعمدة الصف الثاني.هذا عن أقرب ما ستحصل عليه.يمكنك بعد ذلك الحصول على البيانات الأصلية من الصف الأول، ثم تكرار الصفوف اللاحقة للحصول على بيانات رأس بأطراف.

بخلاف ذلك، ما عليك سوى إجراء استعلامين، أحدهما للوالد والآخر للأطفال.قد يكون أسرع من إنشاء جدول النتائج الكبير هذا على أي حال.

نصائح أخرى

zend لا يجعل شكلك المفضل لديك سهلا، ولكن قد يكون من الممكن. ملاحظة، ومع ذلك، فإنك تسأل خادم قاعدة البيانات أن تفعل المزيد من العمل بكثير مما تريد فعلا، لأن معلومات النشر والمستخدم تكرر لكل تعليق. جاستن صحيح أن الاستعلام الثاني أسهل وربما أسرع. ومع ذلك، يمكنني تقديم بعض المؤشرات نحو حل.

لبدء، فكر في ما سوف تحصل عليه باستخدام Zend_Db::FETCH_NUM وضع الجلب:

Array(
    [0] => Array(
        [0] => 12
        [1] =>
        [2] => 1
        [3] => 84
        [4] => This is a post...,
        [5] => 12/this-is-a-post
        [6] =>
        [7] =>
        [8] => 2009-07-21 16:39:09
        [9] => 84
        [10] => John
        [11] => Doe
        [12] => john-doe
        [13] => uploads/userprofiles/0/84/pic84_14
        [14] => 15
        [15] => 12
        [16] => 1
        [17] => 79
        [18] => This is a comment...,
        [19] =>
        [20] =>
        [21] =>
        [22] => 2009-07-21 17:40:10
    ),
    [1] => Array(
        [0] => 12
        [1] =>
        [2] => 1
        [3] => 84
        [4] => This is a post...,
        [5] => 12/this-is-a-post
        [6] =>
        [7] =>
        [8] => 2009-07-21 16:39:09
        [9] => 84
        [10] => John
        [11] => Doe
        [12] => john-doe
        [13] => uploads/userprofiles/0/84/pic84_14
        [14] => 17
        [15] => 12
        [16] => 1
        [17] => 127
        [18] => This is another comment...,
        [19] =>
        [20] =>
        [21] =>
        [22] => 2009-07-20 10:31:26
    )
)

ثم عليك أن توصلت إلى تعيين أرقام الأعمدة إلى أسماء الطاولة والأعمدة:

Array(
    [0] => post.idPost
    [1] => post.idTopic
    [2] => post.idGroup
    [3] => post.idUser
    [4] => post.postContent
    [5] => post.postUrl
    [6] => post.postVotes
    [7] => post.postScore
    [8] => post.date
    [9] => user.idUser
    [10] => user.fname
    [11] => user.lname
    [12] => user.profileUrl
    [13] => user.photoUrl
    [14] => comment.idPost
    [15] => comment.idTopic
    [16] => comment.idGroup
    [17] => comment.idUser
    [18] => comment.postContent
    [19] => comment.postUrl
    [20] => comment.postVotes
    [21] => comment.postScore
    [22] => comment.date
)

هذا هو الجزء الذي يجعله صادقا، لأن جزء الجدول من هذا هو محددا بقوة لواجهة قاعدة البيانات، وليس ممكنا دائما. لأنه مرتبط بمجموعة النتائج، سيكون المحول هو أفضل مكان للحصول عليه؛ هذا يعني اختراق الفصول zend، ربما من خلال توفير فئة المحولات الخاصة بك. اعتمادا على قاعدة البيانات الخاصة بك، قد تأتي المعلومات من:

قد لا يكون للمحولات الأخرى طريقة للحصول على اسم الجدول، لسوء الحظ.

نعم لدينا نفس المشكلة، انتهت للتو من التدوين حول هذا الموضوع: http://www.kintek.com.au/blog/zend-db-and-goins/

تحتاج إلى تسمية كل حقل بشكل فريد، إنه علة معروف في zend: http://framework.zend.com/issues/browse/zf-6421؟page=com.atlassian.jira.plugin.system.issuetabpanels: بكلمة

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