Yii2 Путаница с реляционными базами данных

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

Я пытался найти именно то, что мне нужно сделать, но я немного запутался. Я считаю, что мне нужно настроить внешние ключи и как-то связать их, но тут я теряюсь. Также я думаю, что после настройки части базы данных инструмент gii подхватывает «отношения», когда я строю новую модель? Я думаю, что мне придется собирать вручную новую модель / контроллер вместо использования gii, который отправляет все шаблоны в каталог ‘frontend’, а не в мой версионный каталог ‘module / v1’


—-ИЗМЕНЕНО для изменений —-

таблица ‘состояние’:

- country_id is the index

+--------------------------------------+---------------------------------+
| Column     | Internal Relations      | Foreign Key constraint (INNODB) |
+--------------------------------------+---------------------------------+
| country_id | yii2.country.country_id | yii2.ountry.country_id          |
+------------------------------------------------------------------------+

+-------------+------------------+----------------------+
| id (int, AI)| country_id (int) | state_name (varchar) |
+-------------+------------------+----------------------+
| 0           | 10               | Texas                |
| 1           | 10               | New York             |
| 2           | 20               | Glasgow              |
+-------------+------------------+----------------------+

таблица «страна»:

- country_id is the Primary Key
- column to display in relation-view is country_name
+------------------+--------------------------+
| country_id (int) | country_name (varchar)   |
+------------------+--------------------------+
| 10               | United States of America |
| 20               | Germany                  |
+------------------+--------------------------+

Поэтому моя цель состоит в том, чтобы мой запрос API api: localhost/yii2/api/web/vi/states/

  • И получите ответ:

    {
    «успех»: правда,
    «данные»: [
    {
    «id»: 1,
    «country_id»: 10,
    «state_name»: «Texas»},
    {
    «id»: 2,
    «country_id»: 10,
    «state_name»: «New York»},
    {
    «id»: 3,
    «country_id»: 20,
    «state_name»: «Глазго»}
    ] }
    }

модель (State.php):

<?php

namespace api\modules\v1\models;

use Yii;

/**
* This is the model class for table "state".
*
* @property integer $country_id
* @property string $state_name
*
* @property Country $country
*/
class State extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'state';
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['country_id', 'state_name'], 'required'],
[['country_id'], 'integer'],
[['state_name'], 'string', 'max' => 55]
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'country_id' => 'Country ID',
'state_name' => 'State Name',
];
}

/**
* @return \yii\db\ActiveQuery
*/
public function getCountry()
{
return $this->hasOne(Country::className(), ['country_id' => 'country_id']);
}
}

контроллер (StateController.php):

<?php

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

/**
* Country Controller API
*
*/
class StateController extends ActiveController
{
public $modelClass = 'api\modules\v1\models\State';
}

0

Решение

Настройте внешние ключи в базе данных и использовать gii для генерации моделей, и они будут автоматически связывать их в соответствии с вашими отношениями, а затем вы можете использовать его следующим образом …

$states= State::find()->with('countries')->all();

этот код даст вам штаты со своими странами

2

Другие решения

Я считаю, что я должен настроить внешние ключи и связать их как-то, но
вот где я заблудился. Также я думаю, что однажды часть базы данных
Устанавливает ли инструмент gii на «отношения», когда я строю
новая модель?

да

Я думаю, что придется вручную построить новую модель / контроллер вместо
используя gii, который отправляет все шаблоны в каталог ‘frontend’ и
не мой версионный каталог ‘module / v1’

Вы можете заставить Gii отправлять файлы куда угодно, вам просто нужно разместить пространство имен в нужном месте.

0