【问题标题】:Unique record but only for a given parent in Laravel 5.5唯一记录,但仅适用于 Laravel 5.5 中的给定父级
【发布时间】:2018-02-22 21:59:58
【问题描述】:

我有 2 个数据库模型,都有一个 URL 字段,因此您可以访问它们。在前端我会做这样的事情来访问它:

/{{ $parent->url }}/{{ $child->url }}

验证父 URL 很容易,我只是确保它对于该表是必需的并且是唯一的。但是小孩子有点狡猾。我需要 URL 是唯一的,但前提是记录共享相同的父级。目前我创建新记录的验证规则是:

'url' => 'required|alpha_dash|unique:child_table,url',

并更新为:

'url' => 'required|alpha_dash|unique:child_table,url,' . $id,

但这意味着 每个 URL 必须是唯一的,我不想强​​制执行该规则。我知道父记录 ID,所以有没有办法说 URL 必须是唯一的,但仅适用于具有此父 ID 的记录?

明确地说,这是不允许的:

/parent1/child1
/parent1/child1

但这是:

/parent1/child1
/parent2/child1

【问题讨论】:

    标签: validation laravel-5


    【解决方案1】:

    这样的事情可以帮助您实现这一目标:

    Rule::unique('child_table', 'url')->where(function ($query) use ($parentId) {
        return $query->where('parrent_id', $parentId);
    })
    

    【讨论】:

    • 更新记录时,相同的规则不起作用。基本上,当您编辑记录且未进行任何更改时,单击保存。它仍然会触发验证,而不是应该被忽略。
    【解决方案2】:

    如果有人需要这个,结果会稍微复杂一点:

    'url' => ['required', 'alpha_dash', Rule::unique('child_table', 'url')->where(function($query) use ($parentId) {
        return $query->where('parentId', '=', $parentId);
    })],
    

    【讨论】:

    • 可以去掉'=',这里默认使用那个操作符,所以只能有'parent_id', $parentId
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多