Получение связанных данных в аккордеоне.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Получение связанных данных в аккордеоне.

Сообщение 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']);
    }

}

Так же делаю виджет для вывода данных аккордеоном.

Как сделать вывод так чтобы под каждой категорией были свои врачи?
Изучаю веб-программирование, не ругайтесь сильно)
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение dunakov »

Можно ли сразу получить массив дерева?
Изучаю веб-программирование, не ругайтесь сильно)
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: Получение связанных данных в аккордеоне.

Сообщение Auramel »

Разве при такой связи не нужна промежуточная таблица?
Получаете список - делаете перебор и выводите, не?
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение dunakov »

Auramel писал(а): 2018.02.20, 13:27 Разве при такой связи не нужна промежуточная таблица?
Получаете список - делаете перебор и выводите, не?
ну связь не критично, можно и сделать 1 ко многим. У 1 категории несколько врачей.

Но изначально мне нужно получить объект, переделанный в массив, где у каждой категории есть свои врачи, привязанные по id.
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Получение связанных данных в аккордеоне.

Сообщение andku83 »

Auramel писал(а): 2018.02.20, 13:27 Разве при такой связи не нужна промежуточная таблица?
однозначно нужна.
постройте правильную структура БД и перегенерируйте модели, тогда увидите как нужно было связи прописывать
dunakov писал(а): 2018.02.20, 13:36 ну связь не критично, можно и сделать 1 ко многим. У 1 категории несколько врачей.
вообще-то реализация для разных типов связей будет различной
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение 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;

    }
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Получение связанных данных в аккордеоне.

Сообщение 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();
смотря что нужно для задачи
Последний раз редактировалось andku83 2018.02.20, 14:22, всего редактировалось 1 раз.
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение dunakov »

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

with(['doctors' => function($q){$q->indexBy('id')->select(['id'])}])
В этой части кода что-то не так. На скобку закрытия анонимной функции ругается. Но я такую запись встречаю впервые
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Получение связанных данных в аккордеоне.

Сообщение andku83 »

не хватало ";" перед закрывающей скобкой, исправил

З.Ы. знаете сколько раз вы еще увидите что-то впервые? ;)
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение 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
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Получение связанных данных в аккордеоне.

Сообщение andku83 »

в вашем случае верните обратно то что было и вот что вам нужно было написать:

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

    ->with([
        'doc' => function ($q){ 
        ...
я писал в виде как оно было бы если бы вы правильно именовали связи или воспользовались генератором
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение dunakov »

shnir писал(а): 2018.02.20, 15:04 в вашем случае верните обратно то что было и вот что вам нужно было написать:

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

    ->with([
        'doc' => function ($q){ 
        ...
я писал в виде как оно было бы если бы вы правильно именовали связи или воспользовались генератором

Генератор для опытных юзеров. Его не юзал. Как описана связь я показал.

Но у меня две модели.

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

class Category extends ActiveRecord
{
    public static function tableName()
    {
        return ['category'];

    }
    public function getDoc()
    {
        return $this->hasMany(Doctor::className(), ['category_id'=> 'id']);
    }


}



Я отдельно проверял, что оно возврщает. Там красивый массив с данными, но только с данными одной таблицы
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Получение связанных данных в аккордеоне.

Сообщение andku83 »

генератор кода как раз для новичков https://yiiframework.com.ua/ru/doc/guide/2/start-gii/

если вы даже не понимаете что должен возвращать метод tableName()
тогда дальше объяснять тяжело
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение dunakov »

shnir писал(а): 2018.02.20, 15:25 генератор кода как раз для новичков https://yiiframework.com.ua/ru/doc/guide/2/start-gii/

если вы даже не понимаете что должен возвращать метод tableName()
тогда дальше объяснять тяжело
Понимаю, я для чего он нужен и зачем. Да там кое где неверно написал. tableName() нужен в случае если Модель названа не по имени таблицы. Ну и просто для правильности. Так как tableName() объявляет имя таблицы базы данных.
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Получение связанных данных в аккордеоне.

Сообщение andku83 »

тогда как там мог оказаться массив?
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Получение связанных данных в аккордеоне.

Сообщение dunakov »

shnir писал(а): 2018.02.20, 15:38 тогда как там мог оказаться массив?
Это мой косяк. Делаю три дела сразу и забыл что к чему. Не подумал прежде чем этот бред написал. И я уже сделал , всё исправил. Вот так работает. Спасибо

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

$this->data=Category::find()->with(['doc'])->indexBy('id')->asArray()->all();
Изучаю веб-программирование, не ругайтесь сильно)
Ответить