php - Laravel 5 验证唯一(数据库)仅适用于相同的外键

标签 php validation laravel laravel-5

是否可以编写验证规则来检查特定外键字段的唯一性。

enter image description here

所以我想检查 Artikel(文章)对于 Kunde(客户)是否是唯一的。

客户通过外键 kunden_id 链接。

这是迁移文件:

Schema::create('artikel', function (Blueprint $table) {
        $table->increments('id');
        //Fremdschlüssel
        $table->integer('kunden_id')->unsigned();
        $table->foreign('kunden_id')->references('id')->on('kunden');
        $table->string('bezeichnung');

        $table->timestamps();
    });;

模型文件:

class Artikel extends Model {
protected $table = "artikel";

public function kunde(){
    return $this->belongsTo('App\Models\Kunde');        
}

public function listPaletten(){
    return $this->hasMany('App\Models\Palette');
}
}

最佳答案

PHP 或任何其他语言不可能通过首先选择数据然后在用户代码中进行比较来准确验证数据库中的任何类型的唯一性。

只有数据库才能告诉您某些东西是否是唯一的。

原因如下:

当您查询某些内容并检索结果时,会过去一小段时间(对于我们人类来说,这很短,但对于计算机来说,这就像亿万年)。在此时间内,记录可以进入,但您无法考虑新记录 - 这是由于并发访问造成的。因此,在检查旧记录的同时,存在引入新记录的可能性。由于这种可能性,根据定义不可能准确确定唯一性。

数据库中的唯一性是通过将唯一键放置在适当的列上并插入数据来处理的。如果发生冲突,数据库会拒绝插入,并且您确定指定的信息组合存在。

这是正确确保唯一性的唯一方法。其他一切都不安全,不应依赖。

就您而言,这意味着您将有一个将项目链接到用户的表,并且您在 (kunden_id, artikel_id) 上放置一个唯一键

您必须尝试插入到该表中,如果出现异常,表明存在重复记录 - 检查失败,则项目存在。

当然,你总是可以说“好吧,你所说的情况永远不会发生在我身上”,并且你可以在插入记录之前查询该记录是否存在 - 但如果你将来遇到任何相关错误,请记住我写的内容重复条目。

关于php - Laravel 5 验证唯一(数据库)仅适用于相同的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560467/

相关文章:

php - Codeigniter 自定义回调返回包裹在段落中的消息

php - 如何缓存个性化新闻提要以最小化数据库读取查询?

javascript - 在模式 Bootstrap 中验证注册表单

用于生产的 php artisan 与 apache/nginx

laravel - 如何设置 Laravel Cashier 的默认货币

javascript - 使用 Ajax 单击按钮删除表行

php XML DOM 将特殊字符转换为 and#xYY;

laravel - 用于经过身份验证的用户和 guest 用户的单一 API

c# - 验证 WCF 和 WebService 方法参数值的最佳方式

java - Spring-MVC:调用 validator ,而不是从 Controller 内部