dongpenggan6812 2013-06-03 14:40
浏览 20
已采纳

在ATK4中加入和遍历模型

I have a following query,

$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);

Now, I want to traverse all 'users' their 'profiles' and 'activity' associated with each profile. Relation between User & Profile is 1:n, relation between Profile and Activity is also 1:n.

Is it possible to get something like this?

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

Earlier I have used fetching association via ref() but this is slow when number of users are very huge and I don't want to have multiple queries on DB.

My current setup is,

$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
                }
            }
        }
    }
}
  • 写回答

1条回答 默认 最新

  • drccfl9407 2013-06-03 18:21
    关注

    Something like this should work:

    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();
            }
        }
    }
    

    But this is completely untested example. I posted it here just to give you idea how to work with joins and extended models. In this case there should be only one SQL request and only one loop, because you actually need to loop by mails not by users/profiles/activities.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效