gpt4 book ai didi

mysql - 同一个表 Gas Orm 的多个外键

转载 作者:行者123 更新时间:2023-11-29 05:12:11 28 4
gpt4 key购买 nike

从今天早上开始,我面临着一个非常大的问题。我正在使用 CodeIgniter 开发网站,并使用 GAS ORM 开发数据库。我基本上有两张 table 。一个叫“pool”,一个叫“partners”。我在这两个表之间有两个关联,所以我的表 Partners 中有两个外键引用表池。

池(#id:整数,名称:varchar)合作伙伴(#id:integer, associated_pool_id=>Pool, futur_associated_pool_id=>Pool)。

因为我有两个对同一个表的引用,所以我不能将外键命名为“pool_id”。所以在我与 Gas ORM 的关系中,我必须指定列的名称。我这样做了,但它不起作用...这是我所做的:

class Partner extends ORM {

public $primary_key = 'id';
public $foreign_key = array('\\Model\\Pool' => 'associated_pool_id', '\\Model\\Pool' => 'future_associated_pool_id');

function _init()
{

// Relationship definition
self::$relationships = array(
'associated_pool' => ORM::belongs_to('\\Model\\Pool'),
'future_association_pool' => ORM::belongs_to('\\Model\\Pool'),
);

self::$fields = array(
'id' => ORM::field('auto[11]'),
'name' => ORM::field('char[255]'),
'associated_pool_id' => ORM::field('int[11]'),
'future_associated_pool_id' => ORM::field('int[11]')
);

}

在我的 Pool 类中:

class Pool extends ORM {

public $primary_key = 'id';

function _init()
{
// Relationship definition
self::$relationships = array(
'associated_partner' => ORM::has_many('\\Model\\Partner'),
'future_associated_partner' => ORM::has_many('\\Model\\Partner'),
);

self::$fields = array(
'id' => ORM::field('auto[11]'),
'name' => ORM::field('char[50]'),
);

}

我有一个测试 Controller 测试是否一切正常:

class Welcome extends CI_Controller {
public function index()
{

$pool = \Model\Pool::find(1);
echo $pool->name;
$partners = $pool->associated_partner();
var_dump($partners);
}

但我有一个错误说:

Error Number: 1054

Champ 'partner.pool_id' 包含在 where 子句中

SELECT * FROM partner WHERE partner.pool_id IN (1)

我不知道如何向 Gas ORM 指定它不应该使用“pool_id”而是“associated_pool_id”......

谢谢你的帮助!!!!!!!!!!!!!!!

最佳答案

我不知道,这个话题是否仍然是最新的并且对你们中的一些人感兴趣,但总的来说,我遇到了完全相同的问题。

我决定将 Gas ORM 与 CodeIgniter 结合使用作为我的映射器。由于我的数据库结构是给定的,它不遵循 Gas 的 table_pk 约定,我必须自己定义一个 外键,它应该引用我的自定义数据库外键。但是,它的定义对任何东西都没有影响。就像上面的错误一样,映射器无法构建正确的 SQL 语句。该声明看起来与您的相似:

   SELECT * FROM partner WHERE partner.pool_id IN (1)

好吧,Gas 似乎忽略了自定义外键并尝试使用默认的 table_pk 约定。这意味着,它通过将表与下划线字符合并来获取表(在您的情况下:池)和主键(id)。

我发现,orm.php 的构造函数处理实体中定义的每个主键和外键。在第 191 行,代码调用了一个与 empty 组合的 if 子句。 php的功能。由于主键总是定义的,并且语句中没有否定,所以它每次都会跳过子句的内部部分。但是,内部部分负责自定义外键。

长话短说,我在 orm.php 的第 191 行添加了一个否定 (!),这导致我得到以下代码:

if ( ! empty($this->primary_key))
{
if ( ! empty($this->foreign_key))
{
// Validate foreign keys for consistency naming convention recognizer
$foreign_key = array();

foreach($this->foreign_key as $namespace => $fk)
{
$foreign_key[strtolower($namespace)] = $fk;
}

$this->foreign_key = $foreign_key;
}
else
{
// If so far we didnt have any keys yet,
// then hopefully someone is really follow Gas convention
// while he define his entity relationship (yes, YOU!)
foreach ($this->meta->get('entities') as $name => $entity)
{
if ($entity['type'] == 'belongs_to')
{
$child_name = $entity['child'];
$child_instance = new $child_name;
$child_table = $child_instance->table;
$child_key = $child_instance->primary_key;

$this->foreign_key[strtolower($child_name)] = $child_table.'_'.$child_key;
}
}
}
}

好吧,这个小修复对我帮助很大,我希望你们中的一些人也能利用这个提示。

关于mysql - 同一个表 Gas Orm 的多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37812459/

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