Страница 1 из 1
Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:15
dunakov
Добрый день. Изучаю фреймворк yii2 и делаю сайт медицинского портала.
Есть две таблицы category и doctors. Связь многие ко многим.
Это модель Категорий
Код: Выделить всё
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Category extends ActiveRecord
{
public static function tableName()
{
return 'category';
}
public function getDoc()
{
return $this->hasMany(Doctor::className(), ['category_id'=> 'id']);
}
}
И модель doctor
Код: Выделить всё
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Doctor extends ActiveRecord
{
public static function tableName()
{
return 'doctors';
}
public function getCategory()
{
return $this->hasMany(Category::className(), ['id'=> 'category_id']);
}
}
Так же делаю виджет для вывода данных аккордеоном.
Как сделать вывод так чтобы под каждой категорией были свои врачи?
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:21
dunakov
Можно ли сразу получить массив дерева?
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:27
Auramel
Разве при такой связи не нужна промежуточная таблица?
Получаете список - делаете перебор и выводите, не?
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:36
dunakov
Auramel писал(а): ↑2018.02.20, 13:27
Разве при такой связи не нужна промежуточная таблица?
Получаете список - делаете перебор и выводите, не?
ну связь не критично, можно и сделать 1 ко многим. У 1 категории несколько врачей.
Но изначально мне нужно получить объект, переделанный в массив, где у каждой категории есть свои врачи, привязанные по id.
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:40
andku83
Auramel писал(а): ↑2018.02.20, 13:27
Разве при такой связи не нужна промежуточная таблица?
однозначно нужна.
постройте правильную структура БД и перегенерируйте модели, тогда увидите как нужно было связи прописывать
dunakov писал(а): ↑2018.02.20, 13:36
ну связь не критично, можно и сделать 1 ко многим. У 1 категории несколько врачей.
вообще-то реализация для разных типов связей будет различной
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:44
dunakov
shnir писал(а): ↑2018.02.20, 13:40
Auramel писал(а): ↑2018.02.20, 13:27
Разве при такой связи не нужна промежуточная таблица?
однозначно нужна.
постройте правильную структура БД и перегенерируйте модели, тогда увидите как нужно было связи прописывать
dunakov писал(а): ↑2018.02.20, 13:36
ну связь не критично, можно и сделать 1 ко многим. У 1 категории несколько врачей.
вообще-то реализация для разных типов связей будет различной
Я пока промежуточную таблицу не делал, но связь изменил на один ко многим.
Теперь у 1 категории будет несколько врачей.
Чисто Массив категорий я получаю в методе run() в виджете
Код: Выделить всё
public function run()
{
$this->data=Category::find()->indexBy('id')->asArray()->all();
$this->data2=Doctor::find()->indexBy('id')->asArray()->all();
debug($this->data);
return $this->tpl;
}
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 13:49
andku83
Код: Выделить всё
Category::find()->indexBy('id')
->with([
'doctors' => function ($q){
$q->indexBy('id');
}])
->all();
Category::find()->indexBy('id')
->with([
'doctors' => function ($q){
$q->indexBy('id')->select(['id']);
}])
->asArray()
->all();
смотря что нужно для задачи
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 14:06
dunakov
Код: Выделить всё
with(['doctors' => function($q){$q->indexBy('id')->select(['id'])}])
В этой части кода что-то не так. На скобку закрытия анонимной функции ругается. Но я такую запись встречаю впервые
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 14:22
andku83
не хватало ";" перед закрывающей скобкой, исправил
З.Ы. знаете сколько раз вы еще увидите что-то впервые?
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 14:28
dunakov
shnir писал(а): ↑2018.02.20, 14:22
не хватало ";" перед закрывающей скобкой, исправил
З.Ы. знаете сколько раз вы еще увидите что-то впервые?
Я в модель добавил , чтобы возвращало массивом таблицы
Код: Выделить всё
class Category extends ActiveRecord
{
public static function tableName()
{
return ['category' , 'doctors'];
}
public function getDoc()
{
return $this->hasMany(Doctor::className(), ['category_id'=> 'id']);
}
}
А то ругалась на несуществующую таблицу doctors.
Но теперь новая ошибка strpos() expects parameter 1 to be string, array given
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 15:04
andku83
в вашем случае верните обратно то что было и вот что вам нужно было написать:
я писал в виде как оно было бы если бы вы правильно именовали связи или воспользовались генератором
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 15:13
dunakov
shnir писал(а): ↑2018.02.20, 15:04
в вашем случае верните обратно то что было и вот что вам нужно было написать:
я писал в виде как оно было бы если бы вы правильно именовали связи или воспользовались генератором
Генератор для опытных юзеров. Его не юзал. Как описана связь я показал.
Но у меня две модели.
Код: Выделить всё
class Category extends ActiveRecord
{
public static function tableName()
{
return ['category'];
}
public function getDoc()
{
return $this->hasMany(Doctor::className(), ['category_id'=> 'id']);
}
}
Я отдельно проверял, что оно возврщает. Там красивый массив с данными, но только с данными одной таблицы
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 15:25
andku83
генератор кода как раз для новичков
https://yiiframework.com.ua/ru/doc/guide/2/start-gii/
если вы даже не понимаете что должен возвращать метод tableName()
тогда дальше объяснять тяжело
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 15:36
dunakov
Понимаю, я для чего он нужен и зачем. Да там кое где неверно написал. tableName() нужен в случае если Модель названа не по имени таблицы. Ну и просто для правильности. Так как tableName() объявляет имя таблицы базы данных.
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 15:38
andku83
тогда как там мог оказаться массив?
Re: Получение связанных данных в аккордеоне.
Добавлено: 2018.02.20, 15:42
dunakov
shnir писал(а): ↑2018.02.20, 15:38
тогда как там мог оказаться массив?
Это мой косяк. Делаю три дела сразу и забыл что к чему. Не подумал прежде чем этот бред написал. И я уже сделал , всё исправил. Вот так работает. Спасибо
Код: Выделить всё
$this->data=Category::find()->with(['doc'])->indexBy('id')->asArray()->all();