• Возможно ли обрабатывать входящую почту на сервере php скриптом?

    @AndreyMarkov Автор вопроса
    Да, действительно это примерно то что нужно, буду пробовать ваш вариант, спасибо вам большое за статьи.
  • Существуют ли хостинг с Mysql 5.7?

    @AndreyMarkov Автор вопроса
    Сергей Горностаев, VPS конечно и удобнее и более гибок, и цены на них сейчас вполне не плохие, но чем именно удобен хостинг, это то что ты сразу получаешь настроенный хостинг фактический из коробки c панелью управления и прочими плюшками. На VPS туже cpanel нужно приобретать отдельно, не говоря что правильная настройка сервера это тоже время и опыт. Да и в принципе если честно меня устраивают возможности хостинга, просто в mysql 5.7 появилась удобная работа с json :( но как то тостеры не спешат обновятся.
  • Существуют ли хостинг с Mysql 5.7?

    @AndreyMarkov Автор вопроса
    Nick Flmbr, MySQl 5.6 что в принципе везде :(
  • Как сделать связь между 3 таблицами?

    @AndreyMarkov Автор вопроса
    Получается, что в цикле Вы обращаетесь к базе данных, это плохо.


    Я это понимаю, просто это быстрый пример для тестирования выборки и не более.. Я его пересмотрю, просто вроде как досадно, что вроде решение где то близко, но не совсем.

    Я про поисковую модель понял, но хотеться это сделать иначе. В принципе выше проведенный вариант почти меня устраивает, особенно если найду как обратиться к viaTable.

    В остальном всё равно спасибо вам большое.
  • Как сделать связь между 3 таблицами?

    @AndreyMarkov Автор вопроса
    slo_nik, по сути вот это почти решает мою проблему осталось найти возможность передать нужный параметр.

    в самой модели ...

    public function getDamages()
    {
        return $this->hasMany(Damage::className(), ['id' => 'damage_id'])
                ->viaTable('car_has_damage',['component_id' => 'id']);
    }


    foreach (\app\models\base\Component::find()->with('damages')->all() as $component ) {
    
        //Выводим компонент
        echo Html::tag('div',$component->name);
        //Выводим все повреждения связанные с этим компонентом
        foreach ($component->damages as $damage) {
            echo Html::tag('span',' ----- ' .$damage->name);
        }
    }


    Практический работает идеально, за исключением того что выбирает повреждения всех машин.
    Это естественно так как пока он работает только с 2 полями в таблица car_has_damage ['component_id','damage_id']

    Теперь если прямо в модели пропишу

    public function getDamages()
    {
        return $this->hasMany(Damage::className(), ['id' => 'damage_id'])
                ->viaTable('car_has_damage',['component_id' => 'id'],
                function($query) { return $query->where(['car_id' => 1]); });
    }


    То уже на выходе получу модули а внутри модулей все повреждения связанные с первым автомобилем.

    SELECT * FROM `car_component`

    SELECT * FROM `car_has_damage` WHERE (`car_id`=2) AND (`component_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41))

    SELECT * FROM `damage` WHERE `id` IN ('15', '11')

    Но пока я не могу найти способ как из контроллера передать ID нужной мне машины в viaTable.

    если это сделать так
    foreach (\app\models\base\Component::find()->with(['damages' => function($query) { return $query->andWhere(['car_id' => $car->id ]) ])->all() as $component ) {


    То у меня получается вот такой ответ :

    Unknown column 'car_id' in 'where clause';

    Что в принципе естественно так как в таблица damage такое поле просто не существует.

    SELECT * FROM `damage` WHERE (`car_id`=1) AND (`id` IN ('15', '11', '13'))

    Если же всё сделать через joinWith ... то я получаю только те компоненты у которых есть повреждения связанные с этой машиной.

    Прошу прощение, или я очень запутался или во что то не могу очень сильно вникнуть.
  • Как сделать связь между 3 таблицами?

    @AndreyMarkov Автор вопроса
    С данным вебинаром знаком, он действительно хороший, но далек от той цели что я себе поставил, Связать 2 модели через третью не так сложно, а вот связать 3 таблицы через для меня оказалось тяжелее.

    Хотя благодаря вашей помощи, я получил более менее рабочий прототип.

    Хотя что интересно, единственное не могу понять. Почему если он не находит связь в таблице car_has_damage он отправлять такой запрос.


    SELECT * FROM `damage` WHERE 0=1

    При переборе компонентов автомобиля если в таблице car_has_damage существует связь типа_компонента с типом_повреждения запрос проходит верно

    SELECT * FROM `car_has_damage` WHERE (`component_id`=1) AND (`car_id`=2)
    SELECT * FROM `damage` WHERE `id` IN ('3', '2')

    а вот во втором случане

    SELECT * FROM `car_has_damage` WHERE (`component_id`=2) AND (`car_id`=2)
    SELECT * FROM `damage` WHERE 0=1

    Конечно я понимаю это связанно с тем что во втором варианте первый запрос не находит связей и приходит пустой, но мне не понятно зачем HasMany пытается найти связь если первый запрос приходит пустым.

    Конечно можно сделать всё проще через
    Join
    public function getDamages(){
    return Damage::find()->rightJoin('car_has_damage','car_has_damage.damage_id = damage.id')->andWhere(['car_has_damage.component_id' => $this->id]);
    }

    Но как я понимаю таким способом не получиться вызвать жадную загрузку.
  • Как сделать связь между 3 таблицами?

    @AndreyMarkov Автор вопроса
    Большое спасибо, вы очень внятно разъяснили суть моего вопроса и указали мне на мои ошибки, я за это благодарен.

    Но, всё же так получается что в модели Components, такой параметр как car_id просто отсутствует, и вроде как не хотелось бы его отдельно объявлять так как он там не нужен, не ужели нет метода, получить не объект ActiveQuery а просто данные обратившись напрямую к методу и переда туда данные ?

    $component = $component->getDamages($car->id)
  • Как сделать связь между 3 таблицами?

    @AndreyMarkov Автор вопроса
    Я опечатался когда писал пример для сайта, на деле же у меня почему то при обрещении к методу $component->damages всё работает но не могу в таком варианте передать ID а вот если делаю вот так $component->getDamages(); вылетает такая фигня так как место класса Damage возвращается NULL, NULL, NULL , app\models\Component и так далее