保存关系时强制“条件”

时间:2013-12-03 11:23:48

标签: php laravel-4 eloquent

我第一次使用Laravel 4为客户构建Web应用程序。我有两个表,UserZone,它们之间有关系。

特别是,这是(简化的)User

Schema::create('users', function($table) {
    $table->increments('id');
    $table->string('name');
    $table->enum('role', array('type1', 'type2', 'type3')->default('type1');
    $table->integer('zone_id')->nullable();
});

这是Zone

Schema::create('zones', function($table) {
    $table->increments('id');
    $table->string('name');
});

用户可以有零个或一个区域,这就是zone_id可以为空的原因。但是,只有当role列的值为type2type3时才会有一个区域,如果roletype1则不会。{/ p>

这些是我的模特

// models/User.php

class User extends Eloquent {

    public function zone() {
        return $this->belongsTo('Zone');
    }

}

// models/Zone.php

class Zone extends Eloquent {

    public function users() {
        return $this->hasMany('User');
    }

}

我不知道如何在模型中添加role条件。

的确,我正在编写一个失败的测试:

class UserTest extends TestCase {

    public function testUserInZoneMustHaveASpecificRole() {
        $zone = FactoryMuff::create('Zone');
        $user = FactoryMuff::create('User');

        // $user, by default has role == 'type1'

        // This should pass, because I shouldn't be able to
        // associate a role=='type1' user to a zone

        $this->assertFalse($zone->users()->save($user)->save());
    }
}
你可以给我一些帮助吗?由于我的客户要求,我在应用程序的许多部分都遇到了这个问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

我建议您查看“laravelbook / ardent”

https://github.com/laravelbook/ardent

基本Eloquent Model类的扩展正是您想要的 - 它在允许保存之前自动验证

您只需拨打validate(),而不是手动拨打save()

if ( $model->save() ) {
    echo "yay, it was all ok"
} else {
    echo "boo, we failed to save";
}

您创建验证规则的方式与通常使用Laravel的方式相同,但Ardent对于为您处理它们更加智能。