无法使自己雄辩地自动创建联接

问题描述 投票:40回答:4

如果我的问题的答案很明显,请提前道歉。在我将其发布到这里之前,我已经尽力研究了这个主题。

我的大部分框架经验都来自使用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

PHP中的预期结果

我希望收到一个锦标赛对象数组(在PHP中,其中一个锦标赛对象看起来像:

  • tournaments.id
  • tournaments.year
  • tournaments.country_id
  • tournaments.created_at
  • tournaments.updated_at
  • countries.id
  • countries.code
  • countries.name
  • countries.url
  • countries.created_at
  • countries.updated_at

我到目前为止所做的失败尝试

我在虚拟控制器方法中运行了所有这些尝试,并将结果作为格式字符串输出到事件探查器。

尝试失败#1:

虚拟控制器中的PHP代码:

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

生成以下查询:

SELECT * FROM `tournaments`

尝试1号返回:

包含仅包含锦标赛表中各列的锦标赛对象的数组。

尝试失败#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');
    }
}
php laravel laravel-3
4个回答
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');
}

2
投票

根据雄辩的文档:


1
投票

您的“ with”子句要求输入“国家”,但是您的代码将其声明为“国家”。


0
投票

您必须确保在锦标赛模型中声明了您的关系:

© www.soinside.com 2019 - 2024. All rights reserved.