Как связать 3 таблицы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
vano.mig
Сообщения: 73
Зарегистрирован: 2016.11.21, 10:25

Как связать 3 таблицы

Сообщение vano.mig »

Привет всем! Очень нужна помощь! я новичек в yii2, нужно сделать выборку из таблиц...никак не получаеться... 2 таблицы связываю так -

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

 return $this->hasMany(Products::className(), ['id' => 'id_prod']); 
- все ок, а когда добавляю

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

viaTable(ProductsImage::tableName(), ['product_id' => id]) 
- не работает и ошибки не пишет...
массив получается такой:

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

Array
(
    [0] => Array
        (
            [id] => 1
            [id_cat] => 1
            [id_subcat] => 0
            [id_rub] => 15
            [id_prod] => 1
            [category] => Array
                (
                )

        ) 
а в запросе к базе -

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

SELECT * FROM `products` WHERE 0=1
Скажите, где я ошибся?
сам код:

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

<?php 
namespace app\models;
use yii\db\ActiveRecord;

class ProductsImage extends ActiveRecord {

    public static function tableName() {
        return ('products_image');
    }
} 

?>
модель Products

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

<?php 
namespace app\models;
use yii\db\ActiveRecord;

class Products extends ActiveRecord {

    public static function tableName() {
        return ('products');
    }

    public function getProducts() {
        return $this->hasMany(ProductsImage::className(), ['product_id' => id]);
        //$query = $this->hasMany(ProductsImage::className(), ['product_id' => id]->viaTable(Categories::tableName(), ['id' => 'category_id']));
    }
} 

?>
модель Category

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

<?php 
namespace app\models;
use yii\db\ActiveRecord;

class Category extends ActiveRecord {

    public static function tableName() {
        return ('categories');
    }

    public function getCategory() {
    return $this->hasMany(Products::className(), ['id' => 'id_prod'])->viaTable(ProductsImage::tableName(), ['product_id' => id]);
    }

} 

?>
контроллер

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

<?php
namespace app\controllers;

use Yii;
use app\models\Pages;
use app\models\Sidebar;
use app\models\Products;
use app\models\ProductsImage;
use app\models\Category;

class ContentController extends AppController {

    public function actionProducts() {
        $param = Yii::$app->request->get();
        if (isset($param['cat']) || !empty($param['cat'])) {
            $param = $param['cat'];
        }
        $model = new Sidebar();
        $cat = Sidebar::find()->asArray()->where("name_en = '$param'")->all();
        $id = $cat[0]['id'];
        $model = new Category();
        $result = Category::find()->with('category')->asArray()->where("id_cat = $id")->all();
        debug($result);
        return $this->render('products', compact('query', 'result')); 
    }
} 
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как связать 3 таблицы

Сообщение futbolim »

Оберните код нормально.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Как связать 3 таблицы

Сообщение caHek2x »

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

        $param = Yii::$app->request->get();
        if (isset($param['cat']) || !empty($param['cat'])) {
            $param = $param['cat'];
        }
        $model = new Sidebar();
        $cat = Sidebar::find()->asArray()->where("name_en = '$param'")->all();
зачем так ?
а если у вас get не содержит cat ... ?
$param = Yii::$app->request->get('cat', -1);
вот так не лучше ли ?
------------------------------------
что вот это такое ?
viaTable(ProductsImage::tableName(), ['product_id' => id]);
что за сущность id ... может в кавычки обернуть ?!
------------------------------------
да и вообще что происходит ?
разьясните логику ...
модель Category геттер getCategory возвращает товар ... ?! вы немного нелогично названия даёте ...
а причем тут ProductsImage ? viaTable нужен для связи многие ко многим ... если вы хотите вытащитть товары а в них еще вытащить картинки то
with('category.products')
vano.mig
Сообщения: 73
Зарегистрирован: 2016.11.21, 10:25

Re: Как связать 3 таблицы

Сообщение vano.mig »

есть таблица products с товарами и таблица products_image с изображениями к товарам. Есть еще таблица sidebar - категории и связующая таблица categories.
СУть:
при выборе пункта меню

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

($param = Yii::$app->request->get();
        if (isset($param['cat']) || !empty($param['cat'])) {
            $param = $param['cat'];
        })  
мне нужно подключить нужный товар. Для этого я планировал использовать связующую таблицу categories и выше приведенный код, но что то делаю не правильно...
"если вы хотите вытащитть товары а в них еще вытащить картинки то
with('category.products')" - это в контроллере или в модели?
vano.mig
Сообщения: 73
Зарегистрирован: 2016.11.21, 10:25

Re: Как связать 3 таблицы

Сообщение vano.mig »

caHek2x, спасибо огромное!
Все получилось))) код обязательно оберну!!!
теперь понял ошибку, помогло with('category.products')
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Как связать 3 таблицы

Сообщение caHek2x »

ужас ...
----------------------
я еще раз повторюсь, что это за дичь с вытаскиванием из get категории ? я привел выше как будет корректнее (get('cat', -1);)
ну если не понятно и вам хочется так ок .. .ваше дело ...
----------------------
в модели Category
логичнее былобы назвать связь

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

public function getProducts() {
    return $this->hasMany(Products::className(), ['id' => 'id_prod']);
}
----------------------
в модели Products
логичнее назвать связь

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

public function getImages() {
    return $this->hasMany(ProductsImage::className(), ['product_id' => id]);
}
----------------------
выборка:

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

//какаято жесть:
//$param = Yii::$app->request->get();
//if (isset($param['cat']) || !empty($param['cat'])) {
//    $param = $param['cat'];
//}
$cat_name = Yii::$app->request->get('cat', null);
if ($cat_name === null) throw new NotFoundHttpException("Не передана категория");
//вообще не понятно зачем
//$model = new Sidebar();
//$cat = Sidebar::find()->asArray()->where("name_en = '$param'")->all();
$cat = Sidebar::find()->where(['name_en'=>$cat_name])->one();
if ($cat==null) throw new NotFoundHttpException("Не найдено чтото");
//вообще не понятно зачем
//$model = new Category();
//$result = Category::find()->with('category')->asArray()->where("id_cat = $id")->all();
$result = Category::find()->with('products.images')->where(['id_cat' => $cat->id])->all();
debug($result);
return $this->render('products', ['query'=> $result]);
----------------------
ну и далее вы же понимаете как выводить ?

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

foreach($query as $category){
    echo "Название категории:". $category->name;
    foreach($category->products as $product){
        echo "Название товара:". $product->name;
        foreach($product->images as $image){
            echo "картинка:". $image->path;
        }
    }
}
->path
->name
это для примера ...
Ответить