Laravel对where和join的独特验证

时间:2017-12-20 14:46:13

标签: php laravel laravel-5.5 laravel-validation

我正在尝试在唯一验证规则中添加aditional where子句。但在此之前,我需要与其他表联系。但我没有成功。

我有两张桌子:

带有id和名称字段

role_user_team

使用role_id,user_id和team_id这三个关键。

所以我需要检查teams.name字段对于一个特定用户是否是唯一的。 我试过这个:

'name' => Rule::unique('teams')->where(function ($query){
    //return $query->where('account_id', 1);
    return $query->join('role_user', 'role_user.team_id', '=', 'teams.id')->where('role_user', Auth::user()->id);
          });

我知道问题在于加入,但我不知道如何解决它。 谢谢!

3 个答案:

答案 0 :(得分:0)

高级加入条款

中的

Look at the documentation

$query->join('role_user', function ($join) {
    return $join->on('role_user.team_id', '=', 'teams.id')->on('role_user', '=', Auth::id());
});

答案 1 :(得分:0)

这似乎是在Laravel如何完成对数据库的实际查询之前如何处理QueryBuilder对象的错误。打印查询日志显示未执行实际联接。在documentation (under "additional where clauses")中也可能是一个不足之处,因为这并未提及使用QueryBuilder的限制。

最快的解决方案是动态扩展Validator,如下所示:

function insertTMAfter(name) {
    document.querySelectorAll('*').forEach(function(item){
        if(item.children.length == 0)
            item.innerHTML = item.innerHTML.replace(name, name + "™");
    })
}

insertTMAfter("Stack Overflow");

// or in your case
insertTMAfter("Walmart Inc");

答案 2 :(得分:0)

Laravel 5.8-问题仍然存在。

请参见\ Illuminate \ Validation \ DatabasePresenceVerifier类,方法addConditions()。

可以清楚地看到,如果验证规则条件是闭包,那么它将在嵌套的where节中执行,这排除了使用联接的可能性:

public static void main(String[] args) throws IOException, DocumentException {

    PdfReader reader = new PdfReader("E:\\JDBC\\1.pdf");
    String pageContent = PdfTextExtractor.getTextFromPage(reader, 2);
    System.out.println(pageContent);
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(new File("E:\\JDBC\\2.pdf")));
    document.open();
    Paragraph p = new Paragraph();
    p.add(pageContent);
    document.add(p);
    document.close();
}

是的,在验证规则中使用联接的唯一方法是-制定自己的规则,如aross所说。