Заранее извиняюсь, если ответ на мой вопрос очевиден. Прежде чем написать сюда, я тщательно изучил эту тему.
Большая часть моего опыта работы с фреймворками связана с использованием CodeIgniter, поэтому у меня никогда не было практического опыта использования ORM. (У CI есть несколько готовых решений ORM, но я никогда ими не пользовался.)
Я хотел бы использовать встроенную функциональность ORM в Eloquent ORM Laravel, чтобы автоматически объединять таблицы турниров и стран вместе при запуске. запроси вернуть набор данных, который включает данные турнира, а также связанные с ним данные страны.
То есть я хочу, чтобы Eloquent автоматически распознавал отношение внешнего ключа, чтобы я мог просто запустить запрос (например, Tournament::with('Country')->all()), который вернет весь набор турниров и данные страны.
Пожалуйста, остановите меня прямо сейчас, если я использую Eloquent не по назначению! Мое замешательство может быть больше из-за того, что я пытаюсь собрать воедино несостоятельное решение, а не из-за ошибки синтаксиса или кода.
SELECT * FROM tournaments LEFT JOIN countries ON tournaments.country_id = countries.id
Я ожидаю получить массив объектов Tournament (в PHP), где один объект Tournament будет выглядеть так:
Я провел все эти попытки в методе фиктивного контроллера и вывел результат в виде отформатированной строки в профилировщик.
Код PHP в фиктивном контроллере:
$tournaments = Tournament::with('Country')->all();
Генерирует следующий запрос:
SELECT * FROM `tournaments`
Попытка №1 возвращает:
Массив, содержащий объекты Tournament, которые включают только столбцы в турнирах стол.
Код 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, который работал нормально, но требовал от меня указать соединения, чего я пытаюсь избежать.
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
class Country extends Eloquent {
public static $timestamps = true;
public static $table = 'countries';
}
class Tournament extends Eloquent {
public static $timestamps = true;
public function country()
{
return $this->has_one('Country');
}
}