在FuelPHP中创建一对多关系

时间:2012-12-09 12:01:55

标签: php database-design orm fuelphp

我有3个模型:Client,Task和Taskstatus(用于匹配每个客户的任务) Model_Task

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

Model_Client

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

Model_Taskstatus

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,
        )
    );

Model_Taskstatus

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),则应该出现错误。但它不起作用(我仍然可以在clientstatus中添加客户端ID和任务表中客户端和任务表中不存在的id的值。

1 个答案:

答案 0 :(得分: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文档。