Gra*_*edy 40 php laravel laravel-3
如果我的问题的答案显而易见,请提前道歉.在我发布这篇文章之前,我已经在研究这个主题时做了尽职调查.
我的大多数框架体验来自使用CodeIgniter,所以我从未有过使用ORM的实践经验.(CI确实有一些现成的ORM解决方案,但我从未使用它们.)
我想在Laravel的Eloquent ORM中使用内置的ORM功能,在运行查询时自动将锦标赛和国家/地区表连接在一起,并返回包含锦标赛数据及其相关国家/地区数据的数据集.
也就是说,我希望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');
    }
}
cry*_*one 10
显然with('Country')或with('country')没有任何不同,因为他设法得到以下错误:
Column not found: 1054 Unknown column 'tournament_id' in 'where clause'
SQL: SELECT * FROM `countries` WHERE `tournament_id` IN (?)
这种关系的定义有什么不对:比赛必须有一个国家,比赛需要属于一个国家,而不是一个国家.所以解决这个改变的关系
public function country()
{
    return $this->belongs_to('Country');
}
| 归档时间: | 
 | 
| 查看次数: | 6820 次 | 
| 最近记录: |