Форум программистов, компьютерный форум, киберфорум
PHP: Yii, Yii2
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
9 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,118
1

Как сделать чтоб для каждого Задания выводилось свое время завершения?

28.06.2018, 20:27. Просмотров 1130. Ответов 11
Метки yii2 (Все метки)


Есть таблица Таскс в которой хранятся название задачи и проект задачи.

Есть таблица Таймс,в ней хранятся дата завершения и дата начала задач.




В Виде выводятся список всех записей из таблицы Таскс --- название Задачи и название Проекта задачи .
Они выводятся с помощью цикла foreach


Благодаря запросу в контроллере
PHP
1
2
$model=Tasks::find()->addOrderBy(['timecreation' =>SORT_DESC])->all();  // Выводит все Таски
          $model_vivod_stop_task=Time::find()->one();  //  выводит данные о завершении таска





PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
         <table class="table_price">                            
        <caption>Все задачи</caption>                      
        <tbody>                                            
          <tr id="headnone" >                                
        <th class="headnone">Задачи</th>               
        <th class="headnone" colspan="2">Проект</th>  
    </tr>                                              
                                                       
          <?php foreach ($model  as $current): ?>
 
            <table class="table_price">                            
    <caption>Все задачи</caption>                      
    <tbody>                                            
    <tr id="headnone" >                                
        <th class="headnone">Задачи (Таск)</th>               
        <th class="headnone" colspan="2">Проект</th>  
    </tr>                                              
                                                       
           <?php foreach ($model  as $current): ?>
 
              
 
       <tr>                                                                                                        
             <td height="40" class="tskdetails"> Начало выполнения : <?php echo $current['timecreation']; ?> </td>   
      </tr>                                                                                                       
                                                                                                             
       <tr>                                                                                                              
            <td height="40" class="tskdetails"> Завершение выполнения :  <?php echo $model_vivod_stop_task->stop; ?> </td>
        </tr>                                                                                                             
                                                                                                                          
 
                                                                                                    
          
 
 
         <?php endforeach; ?>
 
 
      </tbody>
</table>




Эта строка обращается как к свойству обьекта а не массива и выводит только первую запись из таблицы Таймс

PHP
1
  <td height="40" class="tskdetails"> Завершение выполнения :  <?php echo $model_vivod_stop_task->stop; ?> </td>






И проблема как раз заключается в том что мне нужна не первая запись (скриншот прилагаю) из таблицы Таймс мне нужно для каждого Задания свое время завершения ,для этого я пробовал переписать запрос чтоб возвращало массив вот так

PHP
1
       $model_vivod_stop_task=Time::find()->all();



А Вывод соотвествено написал так,но в результате после таких изменений вывод Завершения выполнения для каждого Задания имел все значения из таблицы а не для конкретного задания ( скрин 2 прилагаю )
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        <?php if(is_array($model_vivod_stop_task)) :?>
 
    <?php foreach ($model_vivod_stop_task  as $current2): ?>
 
 
 
        <tr>
            <td height="40" class="tskdetails"> Завершение выполнения :  <?php echo $current2['stop']; ?> </td>
        </tr>
            <?php endforeach; ?>
        
    <?php endif; ?>
 
 
    <?php endforeach;  ?>
 
    </tbody>
</table>



Проблема в том как сделать чтоб для каждого Задания выводилось свое время завершения ?
сейчас для каждого Задания выводятся все даты завершения
0
Миниатюры
Как сделать чтоб для каждого  Задания выводилось свое время завершения?   Как сделать чтоб для каждого  Задания выводилось свое время завершения?  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2018, 20:27
Ответы с готовыми решениями:

Как сделать, чтоб выводилось сообщение с четной цифрой(цифрами)
Console.Write(&quot;Введите a - &quot;); double a = double.Parse(Console.ReadLine());...

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

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

Сделать, чтоб по окончании работы программы, в ComboBox автоматически выводилось первое значение из списка
Всем привет, никак не получается разобраться с ComboBox. Задача следующая, во время выполнения...

11
Особый статус
615 / 214 / 163
Регистрация: 18.11.2015
Сообщений: 1,073
29.06.2018, 10:29 2
Цитата Сообщение от TVPNERO Посмотреть сообщение
Есть таблица Таймс,в ней хранятся дата завершения и дата начала задач.
Зачем данное разделение? Разве нельзя в таблице Task реализовать что-то эдакое:
PHP
1
2
3
4
5
6
7
8
9
10
$this->createTable('{{%tasks}}', [
   'id' => $this->primaryKey(),
   'title' => $this->string(255),
   'description' => $this->text(),
   'status' => $this->smallInteger()->notNull(),
   'priority' => $this->smallInteger()->notNull(),
   'started_at' => $this->dateTime(),
   'deadline' => $this->dateTime(),
   'finished_at' => $this->dateTime(),
], '');
Цитата Сообщение от TVPNERO Посмотреть сообщение
Эта строка обращается как к свойству обьекта а не массива и выводит только первую запись из таблицы Таймс
Оно и понятно, вы же делаете непонятно зачем запрос Time::findOne();

Цитата Сообщение от TVPNERO Посмотреть сообщение
А Вывод соотвествено написал так,но в результате после таких изменений вывод Завершения выполнения для каждого Задания имел все значения из таблицы а не для конкретного задания
Тоже оно и понятно, опять же только findAll();

Вообще логики нет в данных запросах.

Вам нужно почитать про реляции, я думаю у вас в таблице Task есть поле-внешний ключ к таблице Time, так вот по этому ключу и делайте связи, например при создании CRUD это делается автоматически, если в миграциях прописано:
PHP
1
2
3
4
5
6
7
8
9
$this->addForeignKey(
   'fk_task_time',
   '{{%task}}',
   'time_id',
   '{{%time}}',
   'id',
   'CASCADE',
   'CASCADE'
);
или наоборот, я не знаю как вы там связывали(а может и вообще не связывали) записи.

Из идеи:
Цитата Сообщение от TVPNERO Посмотреть сообщение
Проблема в том как сделать чтоб для каждого Задания выводилось свое время завершения ?
Я понял, что у каждого Task всего по одной связанной записи в Times, тогда вопрос, который задал выше: "Зачем данное разделение?" очень актуальна.

Но хозяин барин, так что ваша реляция должна выглядеть примерно так:

1. В Tasks model: думаю у вас этот вариант
PHP
1
2
3
4
5
6
7
8
9
10
public function getTime()
{
     return $this->hasOne(Time::className(), ['id' => 'time_id']);
}
 
// example usage:
$tasks = Task::findAll();
foreach($tasks as $task) {
   echo $task->title, PHP_EOL, $task->time->start, ' - ', $task->time->stop;
}
2. Time model
PHP
1
2
3
4
5
6
7
8
9
10
public function getTask()
{
     return $this->hasMany(Task::className(), ['time_id' => 'id']);
}
 
// example usage: в этом случае все как-то коряво, получается у одного Time может быть несколько Task
$times = Time::findAll();
foreach($times as $time) {
   echo $time->task->title, PHP_EOL, $time->start, ' - ', $time->stop;
}
0
9 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,118
29.06.2018, 22:11  [ТС] 3
FloppyDisc,

Я разделил данные на две таблицы в учебных целях ведь в реальных проектах нельзя сложить все в одну таблицу))





У меня таблицы не связаны внешним ключом,я просто в контроллере записываю сразу айди в таблицу Тайм

PHP
1
2
3
4
5
6
7
8
9
10
               public function actionStarttask($id){
 
                   $model=Tasks::find()->addOrderBy(['timecreation' =>SORT_DESC])->all();
 
                   $model2=new Time();
 
                $model2->taskid=$id;
      $model2->save();
 
\\ итд

И я так и не понял как связывание таблиц позволит мне выводить свое время для каждого таска.
и не понял где использовать функции getTime() и getTask().у вас в коде они нигде не используются


А модели у меня простые, просто дают достп к таблицам,там нету методов.


К примеру модель Таскс


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
namespace frontend\models;
 
 
 
 
class Tasks extends \yii\db\ActiveRecord
{
 
    public static function tableName()
    {
        return 'tasks';
    }
 
 
}
 
 
?>


и модель Таймс

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
 
namespace frontend\models;
 
use yii\db\ActiveRecord;
 
 
class Time extends \yii\db\ActiveRecord
{
 
 
 
 
    public static function tableName()
    {
        return 'time';
    }
 
 
 
 
 
 
 
 
 
 
 
}
 
 
?>
0
Миниатюры
Как сделать чтоб для каждого  Задания выводилось свое время завершения?   Как сделать чтоб для каждого  Задания выводилось свое время завершения?  
Особый статус
615 / 214 / 163
Регистрация: 18.11.2015
Сообщений: 1,073
29.06.2018, 23:04 4
Лучший ответ Сообщение было отмечено TVPNERO как решение

Решение

Цитата Сообщение от TVPNERO Посмотреть сообщение
Я разделил данные на две таблицы в учебных целях ведь в реальных проектах нельзя сложить все в одну таблицу))
Почему же, можно, если сущность удовлетворяет правилам нормализации и целостности, но ваш пример не очень удачен и совсем не по правилам.

Цитата Сообщение от TVPNERO Посмотреть сообщение
У меня таблицы не связаны внешним ключом,я просто в контроллере записываю сразу айди в таблицу Тайм
В принципе их не обязательно связывать, оно и так будет работать, но все же, лучше связать - целостность не нарушится.

Цитата Сообщение от TVPNERO Посмотреть сообщение
и не понял где использовать функции getTime() и getTask().у вас в коде они нигде не используются
Используются, просто в виде геттеров, вот более понятный вариант:
PHP
1
2
3
4
5
// example usage:
$tasks = Task::findAll();
foreach($tasks as $task) {
   echo $task->title, PHP_EOL, $task->getTime()->start, ' - ', $task->getTime()->stop;
}
Цитата Сообщение от TVPNERO Посмотреть сообщение
А модели у меня простые
Я бы сказал минималистические, прям как новый вид искусства.

Цитата Сообщение от TVPNERO Посмотреть сообщение
И я так и не понял как связывание таблиц позволит мне выводить свое время для каждого таска.
Советую вам почитать данный раздел документации: Работа со связными данными
1
9 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,118
08.07.2018, 18:25  [ТС] 5
FloppyDisc, матод findAll
PHP
1
$tasks = Task::findAll();
не работает

выдает ошибку
Missing argument 1 for yii\db\BaseActiveRecord::findAll(), called in /var/www/html/timetracker/frontend/controllers/TrackController.php on line 43 and defined
0
Миниатюры
Как сделать чтоб для каждого  Задания выводилось свое время завершения?  
Особый статус
615 / 214 / 163
Регистрация: 18.11.2015
Сообщений: 1,073
09.07.2018, 17:59 6
Цитата Сообщение от TVPNERO Посмотреть сообщение
не работает
::find()->all();
0
9 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,118
11.07.2018, 21:28  [ТС] 7
Цитата Сообщение от FloppyDisc Посмотреть сообщение
Используются, просто в виде геттеров, вот более понятный вариант:

только такой вариант не сработал,ошибка Getting unknown property: yii\db\ActiveQuery::start

PHP/HTML
1
echo $task->title, PHP_EOL, $task->getTime()->start, ' - ', $task->getTime()->stop;


а в виде геттеров сработал
0
Миниатюры
Как сделать чтоб для каждого  Задания выводилось свое время завершения?   Как сделать чтоб для каждого  Задания выводилось свое время завершения?  
Особый статус
615 / 214 / 163
Регистрация: 18.11.2015
Сообщений: 1,073
12.07.2018, 12:03 8
Я не понимаю логики разделения, у вас у каждого Task (задачи) один или несколько Time (времен завершения)? В таком случае придется переделать реляцию в модели:
PHP
1
2
3
4
public function getTimes()
{
     return $this->hasMany(Time::className(), ['id' => 'taskid']);
}
он вернет массив значений, которые так же надо перебирать через цикл:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$tasks = Task::find()->all();
foreach($tasks as $task) {
  /**
    *@var $task Task
    */
   echo 'Задача: ', $task->title, PHP_EOL; 
   /**
    *@var $time Time
    */
   foreach($task->times as $time) {
      echo  'Время: ', $time->start, ' - ', $time->stop, PHP_EOL;
   }
}
0
9 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,118
15.07.2018, 17:16  [ТС] 9
FloppyDisc, нет для каждого Таска одно время в таблице Тайм .То есть вреся завершения одно для каждого таска.


Просто вариант этот вариант цыкла с геттерами работает
PHP
1
2
3
4
5
6
7
foreach($tasks as $task) {
      echo $task->name, PHP_EOL, $task->time->start, ' - ', $task->time->stop,' - ',$task->time->wasted;
 
   
 
 
  }

А этот не работает.И непонятно почему.
PHP
1
 $task->name, PHP_EOL, $task->getTime()->start, ' - ', $task->getTime()->stop;
0
Особый статус
615 / 214 / 163
Регистрация: 18.11.2015
Сообщений: 1,073
16.07.2018, 09:04 10
Цитата Сообщение от TVPNERO Посмотреть сообщение
А этот не работает.И непонятно почему.
потому что там массив, но если вы переделали реляцию, то они оба не должны работать...
0
9 / 8 / 12
Регистрация: 29.03.2016
Сообщений: 1,118
16.07.2018, 22:18  [ТС] 11
Цитата Сообщение от FloppyDisc Посмотреть сообщение
но если вы переделали реляцию, то они оба не должны работать..
FloppyDisc, я поробовал переделать так,но все равно работает только один вариант


PHP
1
2
3
4
public function getTimes()
{
     return $this->hasMany(Time::className(), ['id' => 'taskid']);
}





Цитата Сообщение от FloppyDisc Посмотреть сообщение
потому что там массив
Так а разве в первом варианте не массив ?
foreach же не будет работать с обьектами.Или в этом случае работает потому что тут массив обьектов ??

PHP
1
2
3
4
public function getTime()
{
     return $this->hasOne(Time::className(), ['id' => 'time_id']);
}
0
Особый статус
615 / 214 / 163
Регистрация: 18.11.2015
Сообщений: 1,073
16.07.2018, 22:55 12
Цитата Сообщение от TVPNERO Посмотреть сообщение
foreach же не будет работать с обьектами
кто это вам сказал

Цитата Сообщение от TVPNERO Посмотреть сообщение
Так а разве в первом варианте не массив ?
Я уже запутался, что тут первое, а что второе...

Цитата Сообщение от TVPNERO Посмотреть сообщение
я поробовал переделать так,но все равно работает только один вариант
Окей, в модели Task создаете "связь" 1:1 между таблицами, это так, образно

PHP
1
2
3
4
5
6
task model
 
public function getTime()
{
     return $this->hasOne(Time::className(), ['id' => 'time_id']);
}
в принципе усе
PHP
1
2
3
4
5
/* SELECT * FROM `task` WHERE `id` = 1
$task = Task::findOne(1);
 
/* SELECT * FROM `time` WHERE `task_id` = 1
echo $task->time->start; //
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2018, 22:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как сделать так, чтобы в конце записи каждого столбца, выводилось сумма столбца?
добрый день. таблица_1 (№, имя_клиента, приход, расход); надо написать запрос, чтобы в конце...

PagerAdapter, как сделать, чтобы у каждого итема было свое название и свой вид?
В этом новичек. Подскажите. class SamplePagerAdapter extends PagerAdapter { @Override...

Как сделать так, чтобы у каждого из ListBox был свой список и свое описание?
Здравствуйте! Задача такая... На форме pagecontrol с двумя вкладками, в каждой listbox и memo. В...

Цикл: как в vba сделать так, чтобы после каждого завершения цикла происходило сохранение файла?
Подскажите как в vba сделать чтобы после каждого завершения цикла происходило сохранение файла?Ну...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.