@hollanditkzn

Как в функции чтобы возвращал foreach всю выборку?

Я использую функцию, для того чтобы сократить код и чтобы не было повторяющего кода во вьюшке, но не получается внутри функции реализовывать foreach. Если я верну значение foreach то выборка будет только одна, а все остальное он не обрабатывает. Если echo делать вместо return то запись попадается не там где надо. То есть нужно чтобы записывалась внутри ячейке td А отображается за этим тегом
function shift($shop_id, $day){
    $monday = Shifts::find()->andWhere(['shop_id' => $shop_id])->andWhere(['>=', 'start_date', date('Y-m-d 00:00:00', strtotime($day))])->andWhere(['<=', 'start_date', date('Y-m-d 23:59:59', strtotime($day))])->all();
    foreach ($monday as $employee){
        return Yii::$app->formatter->asTime($employee->start_date, 'php:H:i').'-'.Yii::$app->formatter->asTime($employee->end_date, 'php:H:i').' '.$employee->user->nameEmployee.'<br>';
    }
}
<table class="table">
        <tr>
            <th>Магазины</th>
            <th>Пн <?= date("d.m", strtotime("last Monday")) ?></th>
            <th>Вт <?= date("d.m", strtotime("last Tuesday")); ?></th>
            <th>Ср <?= date("d.m", strtotime("last Wednesday")); ?></th>
            <th>Чт <?= date("d.m", strtotime("Thursday")); ?></th>
            <th>Пт <?= date("d.m", strtotime("Friday")); ?></th>
            <th>Сб <?= date("d.m", strtotime("Saturday")); ?></th>
            <th>Вс <?= date("d.m", strtotime("Sunday")); ?></th>
        </tr>
        <?php foreach ($shops as $shop){
            echo '<tr>
                <td>'.$shop->name.'</td>';
            echo '<td>'.shift($shop->id, 'last Monday').'</td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>';
        } ?>
    </table>
  • Вопрос задан
  • 212 просмотров
Решения вопроса 1
@ilyale
Сам подход, где смешиваются верстка и логика, скажем так, имеет право на существование в ограниченных специфических задачах...

По поводу решения, насколько я смог понять поток мысли автора, одного цикла по записям $shops не достаточно.
Ваш первый цикл перебирает строки в массиве $shops и формирует строку в верстке для отображения строки данных. Это в границы строки
Между ними (на месте троеточия) должен быть цикл по дням недели, где и вызывается ваша функция, которая обрабатывает данные одного дня.

Надеюсь, поможет.

P.S. ИМХО. Вообще, подход, когда вы извлекаете массив данных (у вас это массив $shops), а затем идете по нему циклом и каждая итерация цикла лезет в БД - это низкопроизводительно и избыточно грузит БД (проще говоря, это говнокод).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы