php - 如何忽略多个字段的唯一性

标签 php mysql laravel-5.3

我有两个模型:城市和学校。正如您已经了解的那样,城市可以有很多学校,考虑到这一点,我将我的模型定义如下:

class School extends Model
{
   public $fillable = ['city_id' ,'name'];

     public function city()
    {
        return $this->belongsTo('App\City','city_id','id');
    }

}

class City extends Model
{
    public $fillable = ['name'];

    Public function schools()
    {
        return $this->hasMany('App\School', 'id','city_id');
    }
}

但是我在尝试验证学校模型的更新时遇到了问题。我必须验证学校名称对于所选城市是否是唯一的。我定义了这样的规则:

$rules = array(
  'name' => ['required', Rule::unique('schools')->ignore($id)],
);
$validator=Validator::make(Input::all(),$rules);

但不允许在所选城市以外的其他城市保存现有名称的学校。如果城市不同,我应该如何更改规则以确保学校名称可以相同。

谢谢。

最佳答案

自定义规则

最好的解决方案是创建一个 custom rule为此,它接受具有相应城市名称/id 的字段作为参数。

类似的东西

//Calling the custom rule like this
['name' => 'required|validateSchool:yourFieldNameOfCityHere'];

像这样在服务提供商中声明自定义验证函数

Validator::extend('validateSchool', function ($attribute, $value, $parameters, $validator) {
   $cityName = ($validator->data, $parameters[0]);

   //Now check if the $value is already set for the specific city by using normal database queries and comparison
  return count(City::whereName($cityName)->schools()->whereName($value)->get()) == 0
});
<小时/>

它有什么作用

自定义验证规则接收您通过函数提供的字段的数据(在上面的代码中为yourFieldNameOfCityHere),因此它知道用户选择了哪个城市。有了这些信息,您现在可以检查是否已经有一所学校的名称与输入的城市相同。

关于php - 如何忽略多个字段的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42740130/

相关文章:

php - WooCommerce 运送到结帐页面上地址的下拉列表

PHP FFI - 将数组 rom Rust 函数返回给 PHP

mysql - sql按日期分组没有时间

php - Laravel 5.3 多重身份验证设置

php - 将另一行添加到现有的 PHP 联系表单

php - MySQLi 不工作,没有错误,没有插入信息

php - Laravel 邮件通知

php - 如何通过单击 PHP 中的按钮来浏览文件并显示其内容?

mysql - 根据日期从数据库中选择行

php - Flex - 如何将 Flex DropDownList 的所选项目的 ID 发送到服务器?