Вывод из таблицы связанной через промежуточную

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

Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

Всем привет! Пишу для общего развития сайт посвященный футболу. Сам дилетант.

Появился такой вопрос.
Имею 3 таблицы, где region и person связаны через club:

region
______
ID
name

club
______
ID
name
region_ID


person
______
ID
name
surname
club_ID


Хочу вывести на странице Региона и клубы, и игроков из этих клубов.
С клубами проблем не возникло - связи прописал все ок.
С игроками сложнее:

В контроллере

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

public function actionView($id)
    {
		$model = Region::find()->where(['region.ID' => $id])->one();
		$clubs = $model->clubs;
		$persons = Region::find()
	->select(['person.*'])	
    ->joinWith('persons')
	->where(['person.ID' => $id])
    ->all();
		
        return $this->render('view', [
            'model' => $model,
			'clubs' => $clubs,
			 'persons' => $persons,
        ]);
    }
В представлении

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

<div class="region-view">

    <h1><?= Html::encode($this->title) ?></h1>

   <?= Html::encode("{$model->name} ({$model->short_name})") ?>
    <?= Html::encode("{$model->parent_ID}") ?>
       <?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode("{$club->name} ") ?>
    </li>
<?php endforeach; ?>
 ___________________________________________ 
<?php foreach ($persons as $person): ?>
    <li>
        <?= Html::encode("{$person->ID} ") ?>
	<?= Html::encode("{$person->name} ") ?>
		
    </li>
<?php endforeach; ?>

</div>
Все отлично работает, выводит айди и имя игрока

Если в представлении добавляю строку

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

<?= Html::encode("{$person->surname} ") ?>
Появляется ошибка

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

Unknown Property – yii\base\UnknownPropertyException
Getting unknown property: app\models\Region::surname
Если в представлении добавляю строку

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

<?= Html::encode("{$person->persons->surname} ") ?>
Появляется ошибка

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

PHP Notice – yii\base\ErrorException
Trying to get property 'surname' of non-object

Не понимаю, что делать. Запрос SQL верный получается, в вар дампе инфа о фамилиях имеется.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Вывод из таблицы связанной через промежуточную

Сообщение Loveorigami »

Getting unknown property: app\models\Region::surname
Где у Вас в регионе surname?

Это что?
$persons = Region::find()

Вы ищите регион с персонами, и получаете модель Региона.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывод из таблицы связанной через промежуточную

Сообщение yiiliveext »

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

$persons = Region::find()
	->select(['person.*'])	
    ->joinWith('persons')
	->where(['person.ID' => $id])
Вы ищете игрока по айди региона? Интересное решение)))
persons - это связь региона? :o а должна быть клуба
Если нужно вывести все клубы в регионе и игроков по клубам, то должно получится что-то вроде этого

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

 <?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        foreach ($clubs->persons as $person)
        {
           <?= Html::encode($person->name) ?>
           <?= Html::encode($person->surname) ?>
        }
    </li>
<?php endforeach; ?>
Если нужны все игроки региона без разбивки по клубам, то в контроллере

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

$persons = Region::find()
	->select(['person.*'])	
    ->joinWith('clubs.persons')
	->where(['region.ID' => $id])
kentoduval
Сообщения: 7
Зарегистрирован: 2019.10.10, 11:42

Re: Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

Persons - связь Регионов с Игроками через Клубы


Вставил то, что Вы написали в контроллер и во вьюшку

Undefined variable: person
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывод из таблицы связанной через промежуточную

Сообщение yiiliveext »

kentoduval писал(а): 2019.10.10, 14:55 Persons - связь Регионов с Игроками через Клубы
тогда

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

<?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        foreach ($model->persons as $person)
        {
           <?= Html::encode($person->name) ?>
           <?= Html::encode($person->surname) ?>
        }
    </li>
<?php endforeach; ?>
kentoduval
Сообщения: 7
Зарегистрирован: 2019.10.10, 11:42

Re: Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

yiiliveext писал(а): 2019.10.10, 15:11
kentoduval писал(а): 2019.10.10, 14:55 Persons - связь Регионов с Игроками через Клубы
тогда

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

<?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        foreach ($model->persons as $person)
        {
           <?= Html::encode($person->name) ?>
           <?= Html::encode($person->surname) ?>
        }
    </li>
<?php endforeach; ?>
Undefined variable: person

не определяет
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывод из таблицы связанной через промежуточную

Сообщение yiiliveext »

В остальны местах person уберите
kentoduval
Сообщения: 7
Зарегистрирован: 2019.10.10, 11:42

Re: Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

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

public function actionView($id)
    {
		$model = Region::find()->where(['region.ID' => $id])->one();
		$clubs = $model->clubs;
		
		
        return $this->render('view', [
            'model' => $model,
			'clubs' => $clubs,
			 
        ]);
    }

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

<?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        foreach ($model->persons as $person)
        {
           <?= Html::encode($person->name) ?>
           <?= Html::encode($person->surname) ?>
        }
    </li>
<?php endforeach; ?>

Вот так ща выглядит - результат тот же
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывод из таблицы связанной через промежуточную

Сообщение yiiliveext »

Вы на подсветку кода в IDE смотрели бы, я ж вам тут примерно пишу)
Так пробуйте

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

<?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        <?php foreach ($model->persons as $person):?>
               <?= Html::encode($person->name) ?>
               <?= Html::encode($person->surname) ?>
        <?php endforeach;?>
    </li>
<?php endforeach; ?>
kentoduval
Сообщения: 7
Зарегистрирован: 2019.10.10, 11:42

Re: Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

yiiliveext писал(а): 2019.10.10, 15:30 Вы на подсветку кода в IDE смотрели бы, я ж вам тут примерно пишу)
Так пробуйте

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

<?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        <?php foreach ($model->persons as $person):?>
               <?= Html::encode($person->name) ?>
               <?= Html::encode($person->surname) ?>
        <?php endforeach;?>
    </li>
<?php endforeach; ?>

Уже лучше, спасибо большое)))

Но косяк теперь в другом, теперь просто цикл такой:

команда
все игроки из региона
команда
все игроки из региона

то есть группировки не получилось
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывод из таблицы связанной через промежуточную

Сообщение yiiliveext »

kentoduval писал(а): 2019.10.10, 15:37 Уже лучше, спасибо большое)))

Но косяк теперь в другом, теперь просто цикл такой:

команда
все игроки из региона
команда
все игроки из региона

то есть группировки не получилось
Да, потому что связь persons должна быть у команды, добавьте ее и тогда замените $model на $club и будет группировать.
kentoduval
Сообщения: 7
Зарегистрирован: 2019.10.10, 11:42

Re: Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

у меня между клубом и игроками тоже есть связь

правда называется тоже Persons
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывод из таблицы связанной через промежуточную

Сообщение yiiliveext »

Ну тогда так и выводите

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

<?php foreach ($clubs as $club): ?>
    <li>
        <?= Html::encode($club->name) ?>
        <?php foreach ($club->persons as $person):?>
               <?= Html::encode($person->name) ?>
               <?= Html::encode($person->surname) ?>
        <?php endforeach;?>
    </li>
<?php endforeach; ?>
kentoduval
Сообщения: 7
Зарегистрирован: 2019.10.10, 11:42

Re: Вывод из таблицы связанной через промежуточную

Сообщение kentoduval »

Благодарю!!!!!!!! Все получилось) Буду дальше изучать.
Ответить