Вывод двух параметров во view из связанных таблиц в foreach

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Вывод двух параметров во view из связанных таблиц в foreach

Сообщение Boglik »

Есть связанные таблицы - user и squad
Пользователи и группы.
У пользователя может быть неограниченное количество групп.

Я во view хочу вывести данные с двух связанных таблиц(user+squad).
Связал таблицы так:

Код: Выделить всё

$getspo = User::find()->where(['id_stab' => '1', 'id_direction' =>'1'])
	->select([ 'user.id', 'user.name', 'user.username'])
	->leftJoin('squad' , 'user.id = squad.id_user')->all();
	return $this->render('../default/squad_info', ['getspo' => $getspo]);
}
- Выводит что нужно: id, username...Так же производит фильтрацию по двум таблицам уникальным id_stab и id_direction, что устраивает.
Но я не могу во view вставить данные одновременно в foreach и не понимаю, как это можно сделать.
Либо

Код: Выделить всё

      return $this->render('../default/squad_info', ['getspo' => $getspo]);
либо

Код: Выделить всё

        return $this->render('../default/squad_info', ['getspo' => $getspo1]);
А

Код: Выделить всё

 return $this->render('../default/squad_info', ['getspo' => $getspo, 'getspo' => $getspo1]); 
это какой-то кошмар.

Можете ли подсказать, как вывести в представление данные из двух связанных таблиц одновременно?
view.php

Код: Выделить всё

<?php foreach ($getspo as $getspo): ?>
<tbody>
    <tr>
        <td><strong><?= $getspo['id'] ?></strong></td>
        <td><?= $getspo['username'] ?></td>

        <td></td>

        <td><span class="badge light badge-success"><?= $getspo['id'] ?></span></td>
        <td><?= $getspo['id'] ?></td>
        <td><?= $getspo['id'] ?></td>
        <td>
            
        </td>
    </tr>
</tbody>
<?php endforeach ?>
unknownby
Сообщения: 747
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение unknownby »

Пробуйте так вывести все данные, которые относятся к Одному юзеру.

Код: Выделить всё

foreach($getspo->squad as $value) {
    echo $value->fieldFromSquad;
} 
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение Boglik »

Смог вывести за пределы цикла foreach, но это не код.
За пределами выводит строковое значение, а в его пределах тоже выводит но исключительно по нулям и там, где должны стоять единицы.
Controller

Код: Выделить всё

     $squad_proverka = Squad::find()->select(['proverka'])->all();
        $getspo = User::find()->where(['id_stab' => '1', 'id_direction' =>'1'])
	->select([ 'user.id', 'user.name', 'user.username'])
	->leftJoin('squad' , 'user.id = squad.id_user')->all();
	return $this->render('../default/squad_info', ['getspo' => $getspo, 'squad_proverka' => $squad_proverka]);
}
view

Код: Выделить всё

<?php foreach ($squad_proverka as $squad_proverka):   ?><?= $squad_proverka['proverka'] ?><?php endforeach ?><? } php  endforeach ?>
                                <?php foreach ($getspo as $getspo):  ?>
                                <tbody>
                                    <tr>
                                        <td><strong><?= $getspo['id'] ?></strong></td>
                                        <td><?= $getspo['username']?></td>

                                        <td><?= $squad_proverka['proverka'] ?></td>
          <?php  endforeach ?>
Или не совсем понимаю как вы предлагаете вывести данные, через реляцию?
goodfriend
Сообщения: 50
Зарегистрирован: 2018.06.02, 09:58

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение goodfriend »

foreach ($getspo as $getspo)

Тут ошибка.
Это должны быть разные переменные.
as $val и в цикле измени
и смотри результат
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение Boglik »

Код: Выделить всё

$val = User::find()->where(['id_stab' => '1', 'id_direction' =>'1'])
	->select([ 'user.id', 'user.name', 'user.username'])
	->leftJoin('squad' , 'user.id = squad.id_user')->all();
	return $this->render('../default/squad_info', ['getspo' => $val] );
}
view.php

Код: Выделить всё

 <?php foreach ($getspo as $val ):  ?>
                                <tbody>
                                    <tr>
                                        <td><strong><?= $val['id'] ?></strong></td>
                                        <td><?= $val['username']?></td>

                                        <td><?= $val['proverka']?></td>
 <?php  endforeach ?>
Getting unknown property: app\modules\admin\models\User::proverka

Я не понимаю, что я не так делаю. Он упорно берет данные из 1 таблицы и напроч игнорирует 2

В принципе, можно составить как-то подзапрос, но не могу придумать как.
vovakazda
Сообщения: 13
Зарегистрирован: 2021.10.16, 23:15

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение vovakazda »

как выводить картинки которые находяться в папке common в frontende и backende
unknownby
Сообщения: 747
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение unknownby »

Boglik писал(а): 2021.10.16, 11:31 Я не понимаю, что я не так делаю.
Пробуйте вывести данные в одном месте через foreach ;)

Код: Выделить всё

<?php foreach ($getspo as $value){ ?>
<tbody>
	<tr>
        	<td><strong><?= $value['id'] ?></strong></td>
        	<td><?= $value['username'] ?></td>
	</tr>
	
	<?php foreach ($value->squad as $val){ ?>
		<tr>
        		<td><?= $val['proverka'] ?></td>
        	</tr>
	<?php } ?>
    
</tbody>
<?php } ?>
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение Boglik »

У меня две таблицы. Таблица мероприятий и таблица заявок.
Пользователи отправляют заявку, данные сохраняются в таблицу zayavka с указанием категории.
id таблицы meropriyatia, хранящие данные о мероприятии, соответствует id_meropryaitie в таблице zayavka
Они связаны в модели.
Я же вывожу список мероприятий в админ-панели и хочу, чтобы были указаны количество заявок к каждому мероприятии.
Решил делать это через запрос sql а не через предыдущий циклический подход.

Поэтому я составил такой запрос но у меня выводит каждый раз разное значение цифр при смене zayavka.id/zayavka.title и тд: и это цифры одинаково распространяются по всем ячейкам, вместо того, чтобы подсчитать количество заявок к каждому мероприятии и вывести его.
Что неправильно здесь, в запросе?

Код: Выделить всё

 
$data = Zayavka::find()->select('zayavka.id_meropriyatie')->leftJoin('meropriyatia', 'zayavka.id_meropriyatie = meropriyatia.id')->count('DISTINCT [[zayavka.id]]');
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение maleks »

Вам нужно что то типа:

Код: Выделить всё

$data = Meropriyatia::find()->select(['meropriyatia.id', 'COUNT(zayavka.id)'])->leftJoin('zayavka', 'zayavka.id_meropriyatie = meropriyatia.id')->asArray()->all();
Запишите сначала на чистом sql что вам надо, а потом уже в AR билдер перегоняйте
Yii2 universal module sceleton - for basic and advanced templates
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение Boglik »

Примерно то, что я хочу получить выглядит так:

Код: Выделить всё

SELECT * FROM `meropriyatia` LEFT JOIN zayavka ON meropriyatia.id=zayavka.id_meropriyatie
Но я не могу составить подсчет.
В вашем случае, maleks - выводит в поле Array
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение maleks »

Ну уберите ->asArray(), это ж я просто, чтобы вы оценили результат

>Примерно то, что я хочу получить выглядит так:
а count забыли?
Yii2 universal module sceleton - for basic and advanced templates
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение Boglik »

Запрос типа

Код: Выделить всё

$data = Meropriyatia::find()->select(['meropriyatia.id', 'COUNT(zayavka.id)'])->leftJoin('zayavka', 'zayavka.id_meropriyatie = meropriyatia.id')->all();
работает без изменений как и

Код: Выделить всё

$data = Meropriyatia::find()->select(['meropriyatia.id', 'COUNT(zayavka.id)'])->leftJoin('zayavka', 'zayavka.id_meropriyatie = meropriyatia.id')->asArray()->all();
Про Count тогда забыл.
Поставил так. считает,

Код: Выделить всё

SELECT COUNT(*) FROM `meropriyatia` LEFT JOIN zayavka ON meropriyatia.id=zayavka.id_meropriyatie where meropriyatia.id=4
Или так

Код: Выделить всё

SELECT COUNT(*) FROM `meropriyatia` LEFT JOIN zayavka ON meropriyatia.id=zayavka.id_meropriyatie
Но как теперь перевести все это в AR по условиям задачи?

Код: Выделить всё

            $data = Yii::$app->db->createCommand('SELECT COUNT(*) FROM meropriyatia LEFT JOIN zayavka ON meropriyatia.id = zayavka.id_meropriyatie')->queryAll();
Выводит в поле так же array
Как и любой другой запрос напрямую:

Код: Выделить всё

     $data = Yii::$app->db->createCommand('SELECT username FROM user where id=1')->queryAll();
Получается, дело не в запросе, а чем-то другом. Только в чем?
(Вангую про совет и документацию, но все же.)
==========================================================


Дошло. не выводилось ничего, потому что это массив.
Ладно, теперь обращается только к 1 записи в таблице zayavka в поле из поля id_meropriyatie

Код: Выделить всё

 $data = Meropriyatia::find()->select(['meropriyatia.id', 'COUNT(meropriyatia.id)'])->leftJoin('zayavka', 'zayavka.id_meropriyatie = meropriyatia.id')->all();
Как правильно построить запрос, чтобы он подсчитывал все заявки и выводил количество? У такого мероприятия столько заявок, у такого то столько и тд.
unknownby
Сообщения: 747
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Вывод двух параметров во view из связанных таблиц в foreach

Сообщение unknownby »

Boglik писал(а): 2022.01.13, 17:14 Дошло. не выводилось ничего, потому что это массив.
Ладно, теперь обращается только к 1 записи в таблице zayavka в поле из поля id_meropriyatie

Код: Выделить всё

 $data = Meropriyatia::find()->select(['meropriyatia.id', 'COUNT(meropriyatia.id)'])->leftJoin('zayavka', 'zayavka.id_meropriyatie = meropriyatia.id')->all();
Как правильно построить запрос, чтобы он подсчитывал все заявки и выводил количество? У такого мероприятия столько заявок, у такого то столько и тд.
Что вам мешает сделать подсчет по связи в представлении вашем? Если вы уж сильно хотите AR, а не работать с массивами :D
Составляете запрос самый простой

Код: Выделить всё

$model = Meropriyatia::findAll();
После передачи значения в представлении делаете вот что.

Код: Выделить всё

count($model->zayavka);
Таким образом вы сохраняете AR.

То что вам советовали с asArray() в большинстве случаев должно работать быстрее, т.к. не тянете все данные и все зависимости модели. Плюс все подсчеты сделали уже в запросе и тем самым убрали выделение памяти на работу php.

Если через asArray

Код: Выделить всё

 $model = Meropriyatia::find()->select(['name', 'COUNT(zayavka.id) as total'])->leftJoin('zayavka', 'zayavka.id_meropriyatie = meropriyatia.id')->asArray()->all();
В представлении пишите так

Код: Выделить всё

echo 'Название мероприятия: ' . $model['name'] . ' Итого заявок: ' . $model['total'] . '<br>';
Ответить