gpt4 book ai didi

php - 无法 Eloquent 自动创建连接

转载 作者:IT王子 更新时间:2023-10-29 00:56:22 24 4
gpt4 key购买 nike

如果我的问题的答案显而易见,请提前致歉。在将其发布到此处之前,我已尽职调查研究了该主题。

我的大部分框架经验都来自于使用 CodeIgniter,因此我从未有过使用 ORM 的实践经验。 (CI 确实有一些现成的 ORM 解决方案,但我从未使用过它们。)

我想在 Laravel 的 Eloquent ORM 中使用内置的 ORM 功能,在运行查询时自动将锦标赛和国家表连接在一起,并返回包含锦标赛数据的数据集以及其相关的国家数据。

也就是说,我希望 Eloquent 自动识别外键关系,这样我就可以运行一个查询(例如 Tournament::with('Country')->all()),它会返回整组锦标赛和国家数据。

如果我以一种从未打算使用的方式使用 Eloquent,请立即阻止我!我的困惑可能更多是关于我试图将一个站不住脚的解决方案混搭在一起,而不是语法或编码错误。

我想在 Eloquent 中复制的查询

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

PHP 中的预期结果

我希望收到一组 Tournament 对象(在 PHP 中),其中单个 Tournament 对象如下所示:

  • tournaments.id
  • tournaments.year
  • tournaments.country_id
  • tournaments.created_at
  • tournaments.updated_at
  • 国家.id
  • 国家代码
  • 国家/地区名称
  • countries.url
  • countries.created_at
  • countries.updated_at

到目前为止我失败的尝试

我在虚拟 Controller 方法中运行了所有这些尝试,并将结果作为格式化字符串输出到分析器。

失败的尝试#1:

虚拟 Controller 中的 PHP 代码:

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

生成以下查询:

SELECT * FROM `tournaments`

尝试 #1 返回:

包含 Tournament 对象的数组,该对象仅包含锦标赛表中的列。

失败的尝试 #2

虚拟 Controller 中的 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');
}
}

最佳答案

显然 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');
}

关于php - 无法 Eloquent 自动创建连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com