使用Eloquent的hasMany与whereIn关系

时间:2019-07-02 01:41:16

标签: php laravel laravel-5 eloquent

我有一个带有标识符数组的用户模型。标识符可以是IP地址或其他名称。可以禁止用户,这是通过其标识符来完成的。但是,我似乎无法使用Eloquent的HasMany关系来完成这种逻辑。

我想要的是,只要存在一个禁令模型(条目),其中标识符与用户标识符数组中的标识符之一匹配,则应将其添加到hasMany关系中。

我尝试将“ HasMany”与“ whereIn”一起使用,但这没有用,因为它仍然会查找外键关系,然后应用“ whereIn”约束。这不是我想要的。

这是我尝试使用禁令定义用户关系的方式。

public function bans()
{
    // Due to how banning works, there might exist a ban record for
    // each of the player's identifier (steam, IP address
    // rockstar license, etc.), and it's essential to get all.

    // All ban records where the identifier column equals one of 
    // the user's identifiers (array)
    return $this->hasMany(Ban::class)->whereIn('identifier', $this->identifiers);
}

可以预期的是,它应该返回所有禁止记录,这些记录在其标识符列中具有用户的标识符之一。但这不起作用,因为HasMany仍会应用外键相等性检查。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为适当的解决方案是使用whereHas。您可以使用此功能执行更高级和更强大的查询。

https://laravel.com/docs/5.8/eloquent-relationships

use Illuminate\Database\Eloquent\Builder;

// Retrieve posts with at least one comment containing words like foo%...
$posts = App\Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

// Retrieve posts with at least ten comments containing words like foo%...
$posts = App\Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
}, '>=', 10)->get();