в ATK4, как мне изменить модель, чтобы получить ОТДЕЛЬНЫЙ список

#php #frameworks #model #distinct #atk4

#php #фреймворки #Модель #отдельный #atk4

Вопрос:

У меня есть список определенных историй, а в другой таблице — набор задач, связанных с этими историями.

Для данного пользователя я хочу получить отдельный список номеров историй, например, если у пользователя несколько задач, история будет указана только один раз.

Я могу сделать это с помощью прямого SQL, но как мне реализовать это с помощью модели в ATK4?

На данный момент таблица, связывающая элементы с историями, имеет модель, определенную следующим образом

 <?php
 class Model_StoryMember extends Model_Table {
public $entity_code='vscrum_story_member';
public $table_alias='sm';

function init(){
           parent::init();
           $this->addField('story_id')->system(true)->visible(false)->   
             defaultValue($this->api->recall('story_id'));
           $this->addField('team_id')->system(true)->visible(false)->
             defaultValue($this->api->recall('team_id'));
           $this->addField('sprint_id')->system(true)->visible(false)->
             defaultValue($this->api->recall('sprint_id'));
           $this->addField('member_id')->refModel('Model_Member');
           $this->addField('points')->datatype('numeric');
           $this->addField('notes')->datatype('text');
 }
 }
 

Эта модель может содержать запись для каждого пользователя, например

     STORY
    ID     Name     Points Responsible
    1000   Story 1      2     1
    1001   Story 2      3     1

    STORY_MEMBER
    ID     Story    Member  Points Description
    1      1000     1       .5     Task 1
    2      1000     1       .5     Task 2 
    2      1000     2       1      Task 1
    3      1001     1       1      Task 1
    4      1001     2       1      Task 2 
    5      1001     3       1      Task 3
 

поэтому, если я просматриваю данные для пользователя 1 или пользователя 2, я хочу вернуть только две строки (хотя у пользователя one есть две задачи в истории 1000)
история 1000
история 1001

и для пользователя 3 я бы получил только одну строку для истории 1001.

Чтобы добавить еще, я хочу иметь возможность объединять два запроса и возвращать отдельный список, поэтому, если я запрашиваю его для элемента 1, если у меня есть базовый sql, например

 SELECT id, name
  from story
 where responsible=1
 union
select s.id, s.name 
  from story s, story_member sm
 where s.id=sm.story_id
   and sm.member_id=1
 

я получу список историй, за которые отвечает участник one, а также тех, в которых они участвуют. Объединение заботится об уникальности сортировки, поэтому каждая история возвращается только один раз (поскольку очень вероятно, что они участвуют в историях, которыми они владеют), но также могут быть истории, в которых они участвуют, но за которые отвечает кто-то другой.

Есть ли способ объединить два запроса вместе, чтобы я получал один массив, возвращаемый на странице?

TIA

Комментарии:

1. Вы можете попробовать переопределить dsql() и изменить запрос на лету.

2. Нет ли способа указать это в модели? — если нет, то я могу просто поместить sql непосредственно на страницу и заполнить данные, которые я хотел, но хотел проверить, есть ли способ, которым я мог бы добавить в цепочку, где я добавляю условия к модели. Не беспокойтесь — все еще пытаюсь определить границы в фреймворке и то, что он делает, уже больше, чем я ожидал. Спасибо

3. да, я бы не стал связываться с моделью.

Ответ №1:

Вероятно, вам лучше использовать запрос вручную. Попробуйте:

 $dsql->option('distinct');
 

Вы можете изменить запрос вашего представления, например, если у вас есть сетка, тогда:

 $this->grid->dq->option('distinct');
 

Вызовите это ПОСЛЕ того, как модель была установлена.

Комментарии:

1. И если у меня есть несколько запросов, объединенных вместе, есть ли способ получить один массив обратно из запроса? Например. «ВЫБЕРИТЕ id, name, xxx из stories_planned ОБЪЕДИНЕНИЕ выберите id, name, xxx из stories_involved», а затем примените опцию distinct сверху?

2. Oracle портит людей! 🙂 $myquery = $dsql-> select() .’ ОБЪЕДИНЕНИЕ ‘.$dsql2->select(); $this-> api-> db->getAllHash($myquery);

3. 🙂 Я думаю, может быть, позволить mysql выполнять работу, что означает, что я просто создаю представление запросов и создаю новую модель на основе представления с addConditions на странице для member_id. Сохраняет код чистым и простым, использует MVC и должен работать нормально. Спасибо

4. ОК. Я всегда пытался упростить mysql, чтобы упростить доступ к nosql или данным кэша, но ваш подход тоже имеет смысл.