Laravel принадлежит множеству промежуточных таблиц

#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