Страница 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
в вашем случае верните обратно то что было и вот что вам нужно было написать:

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

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

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

Добавлено: 2018.02.20, 15:13
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']);
    }


}



Я отдельно проверял, что оно возврщает. Там красивый массив с данными, но только с данными одной таблицы

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

если вы даже не понимаете что должен возвращать метод tableName()
тогда дальше объяснять тяжело
Понимаю, я для чего он нужен и зачем. Да там кое где неверно написал. 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();