Answer the question
In order to leave comments, you need to log in
How to sequentially link three tables?
There are three tables County(id, name), Sity(id,name,country_id),Street(id,name,sity_id)
Country Sity Steet
id name id name country_id id name sity_id
1 Россия 1 Москва 1 1 Арбат 1
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
->via('orderItems');
}
Answer the question
In order to leave comments, you need to log in
The code you posted is an intermediate table that implements a many-to-many relationship. And this is not your case. In this case, it turns out that the City of Moscow belongs to both Russia and any other countries. And Other countries have the city of Moscow.
You have one-to-many relationships. Those.
1) One country (one) has many cities (many).
2) One city (one) has many streets (many).
class Country extends ActiveRecord
{
// HasMany - указывает на то, что получаемое будет множество.
public function getСities()
{
return $this->hasMany(City::className(), ['country_id' => 'id']);
}
}
class City extends ActiveRecord
{
public function getCountry()
{
//HasOne - показывает, что получаемая запись одна
return $this->hasOne(Counter::className(), ['id' => 'country_id']);
}
}
$country = Country::findOne(1); // ищем город с id 1
// SELECT * FROM `City` WHERE `country_id` = 1
// $сities - это массив объектов City
$сities = $country->сities; // Обратите внимание, что в модели города, есть Getter и именно то название.
$countries = Country::find()->with('cities.streets')->all(); // внутри With помещены геттеры связей.
// ниже код, запрос в базу не делает. он вытаскивает все из запроса то что выше. т.е. экономит вашу память и бережет БД.
$streets = $countries[0]->cities[0]->streets; // указывая массивы можно вызвать конкретную страну с конкретным городом и получить нужные улицы.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question