#laravel
#laravel
Вопрос:
У меня есть 3 таблицы, которые выглядят следующим образом:
Торговая площадка
- ID
- Имя
Market_to_City
- market_id
- city_id
Город
- ID
- Имя
и модель, которая выглядит как:
class Market extends Eloquent {
protected $table = 'Market';
public function citys() {
return $this->belongsToMany('City', 'Market_to_City', 'market_id', 'city_id');
}
}
Каждый рынок содержит множество городов, отображенных в таблице Market_to_City. Метод citys должен возвращать коллекцию городов, которые связаны с рынком. Однако это каждый раз возвращает пустую коллекцию, использую ли я правильную взаимосвязь модели?
Комментарии:
1. в чем заключается вопрос? Как написать запрос select? Для этого вам не нужна сводная таблица.
2. Спасибо, обновил сообщение, чтобы действительно задать вопрос!
3. Вы уверены, что в ваших таблицах есть совпадающие данные? Например, если у вас есть рынок с идентификатором 1, вы можете увидеть в своей таблице Market_to_City строки с markey_id, равным 1, и в каждой из этих строк указаны города-значения.
4. @user3158900 ага. В таблице Market_to_City есть записи, которые корректно содержат market_id и city_id (первичный ключ этих соответствующих моделей).
5. Может показаться, что вы правильно настраиваете отношения. Как именно вы их реализуете?
Ответ №1:
Ваш метод выглядит правильным. Однако обратите внимание, что вы назвали его citys
вместо cities
, что могло быть или не быть опечаткой при публикации вашего вопроса здесь. Правильная форма множественного числа city
является cities
, и вам следует ее исправить, потому что Laravel часто использует автоматическую плюрализацию и предполагает, что вы правильно усвоите английский.
Кроме того, вызывается ваша модель Market
, в то время как в комментариях вызываете вы GTM_Market
.
Также предполагается, что у Market
объекта нет cities
свойства, поэтому он успешно вернется к методу, который затем запускает запрос взаимосвязи. Если вы заранее объявите свойство, Laravel никогда не достигнет метода.
class Market extends Eloquent {
public $cities = 'Foo';
public function cities()
{
return $this->belongsToMany('City');
}
}
$market = Market::find(205);
echo $market->cities; // Echoes 'Foo' instead of the relationship.
Наконец, после выполнения всего вышеперечисленного вы сможете повторно загружать отношения следующим образом:
Market::with('cities')->find(205);
Комментарии:
1. Название метода может быть любым. Laravel не использует имя метода для определения имени таблицы. Laravel использует имя модели / класса для определения имени таблицы, если имя таблицы не определено. При этом правильно использовать
cities()
вместоcitys
.2. @Jakobud Я упомянул это скорее как общее правило, но опечатка показалась существенной, потому что он заявил в комментариях, что на самом деле вызывал
cities
, вот так:$market = GTM_Market::find(205); echo $market->cities