在 FuelPHP 中创建一对多关系

Posted

技术标签:

【中文标题】在 FuelPHP 中创建一对多关系【英文标题】:Create one to many relation in FuelPHP 【发布时间】:2012-12-09 12:01:55 【问题描述】:

我有 3 个模型:客户端、任务和任务状态(用于为每个客户端匹配任务)。 模型_任务

protected static $_properties = array(
        'id',
        'name',
        'created_at',
        'updated_at',
    );

Model_Client

protected static $_properties = array(
        'id',
        'name',
        'created_at',
        'updated_at',
    );

模型_任务状态

protected static $_properties = array(
        'id',
        'client',
        'task',
        'created_at',
        'updated_at',
    );

我在 Model_Task 中添加了以下内容

protected static $_has_many = array(
        'taskstatuses' => array(
            'key_from' => 'id',
            'model_to' => 'Model_Taskstatus',
            'key_to' => 'task',
            'cascade_save' => true,
            'cascade_delete' => false,
        )
    );

Model_Client

protected static $_has_many = array(
        'taskstatuses' => array(
            'key_from' => 'id',
            'model_to' => 'Model_Taskstatus',
            'key_to' => 'client',
            'cascade_save' => true,
            'cascade_delete' => false,
        )
    );

模型_任务状态

protected static $_belongs_to = array(
        'client' => array(
            'key_from' => 'client',
            'model_to' => 'Model_Client',
            'key_to' => 'id',
            'cascade_save' => true,
            'cascade_delete' => false,
        ),
        'task' => array(
            'key_from' => 'task',
            'model_to' => 'Model_Task',
            'key_to' => 'id',
            'cascade_save' => true,
            'cascade_delete' => false,
        )
    );

我希望 taskstatus 将客户端字段链接到客户端模型,并将任务字段链接到任务模型,如果用户插入的任务的值不在客户端或任务模型中(通过 id),则会出现错误。但它不起作用(我仍然可以将客户端和任务表中不存在的客户端 id 和任务 id 的值添加到 clientstatus 中。

【问题讨论】:

什么不起作用? “不起作用”不是错误消息!描述你在做什么以及你想要发生什么。 我希望 taskstatus 中的客户端和任务字段必须链接到客户端和任务模型中的 id 字段。我刚刚添加了 2 个客户端和 2 个任务。我希望如果我插入值为 client = 40 和 task = 13 的 taskstatus,例如,会发生一个错误,告诉我我不能这样做。但实际上我仍然可以插入客户端和任务值>2的taskstatus,这是我没想到的。 【参考方案1】:

如果您坚持使用Model convention,以下将正常工作:

class Model_Task extends \Orm\Model

    protected static $_belongs_to = array(
        'client'
    );

    protected static $_properties = array(
        'id',
        'name',
        'client_id',
        'created_at',
        'updated_at'
    );


class Model_Client extends \Orm\Model

    protected static $_has_many = array(
        'task'
    );

    protected static $_properties = array(
        'id',
        'name',
        'created_at',
        'updated_at'
    );

要获得客户的任务,您只需:

$client = Model_Client::find(1);

foreach($client->task as $task)

    /* do something with each $task */

编辑: 这样您就可以避免在客户端/任务之间有不必要的表/模型,从而迫使您将有效任务添加到现有客户端。此外,如果您想在 Client/Task 之间建立 一对多 关系,使用 Model_Taskstatus 将允许您将相同的任务分配给不同的客户端,这不是您想要的。

您应该查看Has Many 文档。

【讨论】:

实际上我有一个适用于所有客户的标准清单。因此,我必须跟进 1 个客户,哪些任务已完成,哪些未完成。因此我认为关系不是客户端和任务之间的关系,而是客户端/任务和任务状态之间的关系。我已经检查了 Has Many Documentation,但不明白“建立和打破 has-many 关系”(它应该放在哪里 - 控制器,模型?以什么方法?“Model_Comment::find”中的 6 是什么意思(6)")。抱歉,我对 Fuelphp 完全陌生,而且文档对我来说似乎不够具体。 在我发布的foreach() 迭代示例中,您可以检查与客户端关联的每个任务的状态。除了 Has Many 文档之外,您还应该检查 Creating models 和所有 ORM documentation。 Model_Comment::find(6) 表示您要获取 id = 6 的 Model_Comment

以上是关于在 FuelPHP 中创建一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

在Yii2中创建一对多关系

如何在 SQL Server 或实体框架中创建没有主键的一对多关系?

在neo4j中创建一对多关系

一对多关系失败

休眠一对多映射注释问题

与附加字段的一对多关系