Невозможно получить Eloquent для автоматического создания объединений

Заранее извиняюсь, если ответ на мой вопрос очевиден. Прежде чем написать сюда, я тщательно изучил эту тему.

Большая часть моего опыта работы с фреймворками связана с использованием CodeIgniter, поэтому у меня никогда не было практического опыта использования ORM. (У CI есть несколько готовых решений ORM, но я никогда ими не пользовался.)

Я хотел бы использовать встроенную функциональность ORM в Eloquent ORM Laravel, чтобы автоматически объединять таблицы турниров и стран вместе при запуске. запроси вернуть набор данных, который включает данные турнира, а также связанные с ним данные страны.

То есть я хочу, чтобы Eloquent автоматически распознавал отношение внешнего ключа, чтобы я мог просто запустить запрос (например, Tournament::with('Country')->all()), который вернет весь набор турниров и данные страны.

Пожалуйста, остановите меня прямо сейчас, если я использую Eloquent не по назначению! Мое замешательство может быть больше из-за того, что я пытаюсь собрать воедино несостоятельное решение, а не из-за ошибки синтаксиса или кода.

Запрос, который я хотел бы повторить в Eloquent

SELECT * FROM tournaments LEFT JOIN countries ON tournaments.country_id = countries.id

Ожидаемый результат в PHP

Я ожидаю получить массив объектов Tournament (в PHP), где один объект Tournament будет выглядеть так:

  • турниры. id
  • турниры.год
  • турниры.country_id
  • турниры.created_at
  • турниры.updated_at
  • country.id
  • country.code
  • country.name
  • country.url
  • country.created_at
  • country.updated_at

Неудачные попытки, которые я 've Made So Far

Я провел все эти попытки в методе фиктивного контроллера и вывел результат в виде отформатированной строки в профилировщик.

Неудачная попытка №1:

Код PHP в фиктивном контроллере:

$tournaments = Tournament::with('Country')->all();

Генерирует следующий запрос:

SELECT * FROM `tournaments`

Попытка №1 возвращает:

Массив, содержащий объекты Tournament, которые включают только столбцы в турнирах стол.

Неудачная попытка #2

Код PHP в фиктивном контроллере:

$tournaments = Tournament::with('Country')->first();

Выдает следующую ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tournament_id' in 'where clause'

SQL: SELECT * FROM `countries` WHERE `tournament_id` IN (?)

Bindings: array (
0 => '1',
)

Другие неудачные попытки

Я пробовал различные комбинации соглашений об именах (например, столбцы, таблицы и т. д.). .) но безрезультатно. Я также пытался создать запрос во Fluent, который работал нормально, но требовал от меня указать соединения, чего я пытаюсь избежать.

Моя среда

  • PHP: 5.3.13
  • MySQL: 5.1.53
  • Laravel: 3.2.3

Связь между таблицами

  • Связь один к одному
  • Турнир должен иметь страну (имеется ограничение внешнего ключа для его применения)
  • Страна может принадлежать многим другим отношениям (например, участник, не показанный здесь, имеет страну рождения)

Таблица стран

CREATE TABLE `countries` (                                                                                                                                                                                                                 
`id` int(11) NOT NULL AUTO_INCREMENT,                                                                                                                                                                                                       
`code` varchar(4) NOT NULL,                                                                                                                                                                                                                 
`name` varchar(25) NOT NULL,                                                                                                                                                                                                                
`url` varchar(25) NOT NULL,                                                                                                                                                                                                                 
`created_at` datetime NOT NULL,                                                                                                                                                                                                             
`updated_at` datetime NOT NULL,                                                                                                                                                                                                            
PRIMARY KEY (`id`),                                                                                                                                                                                                                        
UNIQUE KEY `countries_code_unique` (`code`),                                                                                                                                                                                               
KEY `countries_url_index` (`url`)                                                                                                                                                                                                          
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1

Таблица турниров

CREATE TABLE `tournaments` (                                                                                                                                                                                                             
`id` int(11) NOT NULL AUTO_INCREMENT,                                                                                                                                                                                                       
`year` int(11) NOT NULL,                                                                                                                                                                                                                    
`country_id` int(11) NOT NULL,                                                                                                                                                                                                              
`created_at` datetime NOT NULL,                                                                                                                                                                                                             
`updated_at` datetime NOT NULL,                                                                                                                                                                                                             
PRIMARY KEY (`id`),                                                                                                                                                                                                                         
UNIQUE KEY `tournaments_year_unique` (`year`),                                                                                                                                                                                             
KEY `tournaments_country_id_foreign` (`country_id`),                                                                                                                                                                                      
CONSTRAINT `tournaments_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`) ON UPDATE CASCADE                                                                                                                  
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=latin1

Модель стран (countries.php)

class Country extends Eloquent {
    public static $timestamps = true;
    public static $table = 'countries';
}

Модель турниров (tournaments.php)

class Tournament extends Eloquent {
    public static $timestamps = true;

    public function country()
    {
        return $this->has_one('Country');
    }
}
40
задан Laurence 14 February 2013 в 14:10
поделиться