【问题标题】:Kohana 3: Validation rule for has_many through relationshipKohana 3:has_many 通过关系的验证规则
【发布时间】:2012-06-04 20:50:40
【问题描述】:

是否可以在 Kohana 3 中创建一个验证规则来验证 has_many through 关系?

使用guide page 上的示例,博客文章可以通过categories_posts 表包含许多类别。是否可以在 Post 模型中设置验证规则来验证至少添加了一个类别?

我尝试了以下方法:

public function rules()
{
    return array(
        'categories' => array(
            array(array($this, 'has'), array('categories'))
        )
    );
}

因为我看到ORM::has 函数将返回真/假。但我认为因为“类别”是一种关系,而不是一个字段,所以我写的规则永远不会被检查。

有什么想法吗?

【问题讨论】:

    标签: kohana kohana-3 kohana-orm kohana-3.2


    【解决方案1】:

    您必须先保存Post,然后才能添加has_many 关系。保存后可以查看Post的分类,如果没有设置则标记为草稿。

    【讨论】:

    • 是的,我遇到了这个问题。如果我在保存Post 之前尝试添加has_many 关系,我会收到一个数据库错误,因为Post 还没有ID。
    • 这就是为什么必须在标准模型验证之外检查关系。
    【解决方案2】:

    哇,好主意。 专注于 MVC 设计模式。我认为这是 C 业务而不是 M。

    if ($post->categories->find_all())
    {
       //blablabla
    }
    

    【讨论】:

    • 或者我想我可以只做 $post->categories->count_all() 并确保它大于 0。我只是希望可以使用验证规则。
    【解决方案3】:

    由于 categoriesposts 表之外,因此您需要使用外部验证。创建一个名为 Model_Post::rule_has_valid_categories($submitted_categories, $post) 的函数,该函数返回一个布尔值,表示提交的类别对于这篇文章是否有效。

    然后,在您尝试保存帖子之前创建额外规则:

    $extra_rules = Validation::factory(array('categories' => $submitted_categories))
        ->rule(
        'categories',
        'Model_Post::rule_has_valid_categories',
        array(':value', ':model')
    );
    
    try
    {
        $post->save($extra_rules);
    }
    catch (ORM_Validation_Exception $e)
    {
        // if categories rule failed, array will contain _external[categories] field
        print_r($e->errors('models')); 
    }
    

    您将消息存储在 /application/messages/models/post/_external.php 中:

    return array(
    
        'categories' => array(
            'Model_Post::rule_has_valid_categories' => 'Invalid categories'
        ),
    
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      相关资源
      最近更新 更多