1

我有以下查询,

$users = $q->add('Model_User')
            ->join('profile.user_id', 'id')
            ->join('activity.profile_id', 'profile.user_id')
            ->addCondition('timestamp', '>=', date('Y-m-d'))
            ->addCondition('profile.isActive', true);
            ->addCondition('activity.isDelivered', false)
            ->addCondition('activity.priority', '>=', 2);

现在,我想遍历所有“用户”他们的“个人资料”和与每个个人资料关联的“活动”。User 和 Profile 之间的关系是 1:n,Profile 和 Activity 之间的关系也是 1:n。

有可能得到这样的东西吗?

foreach($users as $user) {
    foreach($user->profile as $profile) {
        foreach ($profile->activity as $activity) {
            //Some actions
        }
    }
}

早些时候我使用通过 ref() 获取关联,但是当用户数量非常大并且我不想在 DB 上进行多个查询时,这会很慢。

我目前的设置是,

$users = $q->add('Model_User')
            ->addCondition('timestamp', '>=', date('Y-m-d'));

foreach($users as $user) {
    $profiles = $users->ref('Profile', 'user_id');
    foreach(profiles as $profile) {
        if($profile['isActive']) {
            $activities = $profiles->ref('Activity', 'profile_id');
            foreach (activities as $activity) {
                if(!$activity['isDelivered'] && $activity['priority'] >= 2) {
                    //Some actions
                }
            }
        }
    }
}
4

1 回答 1

1

像这样的东西应该工作:

class Model_User_ForMailing extends Model_User {
    function init() {
        parent::init();

        // join profile, add profile fields you need later
        $join_p = $this->join('profile');
        $join_p->addField('email');

        // join activity, add activity fields you need later
        $join_a = $join_p->join('activity');
        $join_a->addField('number','act_number');
        $join_a->addField('description','act_descr');

        // add conditions, important where you add them
        $this->addCondition('timestamp', '>=', date('Y-m-d'));
        $join_p->addCondition('isActive', true);
        $join_a->addCondition('isDelivered', false);
        $join_a->addCondition('priority', '>=', 2);
    }

    function actionSendMail() {
        $to = $this->get('email');
        $subject = 'New activity #' . $this->get('act_number');
        $message = 'You have new activity with this description: ' .
                       $this->get('act_descr');
        mail($to, $subject, $message);
    }
}

class mypage extends Page {
    function init() {
        parent::init();

        $m = $this->add('Model_User_ForMailing');
        foreach ($m as $junk) {
            $m->actionSendMail();
        }
    }
}

但这是完全未经测试的例子。我在这里发布它只是为了让您了解如何使用连接和扩展模型。在这种情况下,应该只有一个 SQL 请求和一个循环,因为您实际上需要通过邮件而不是用户/配置文件/活动来循环。

于 2013-06-03T18:21:11.977 回答