在Eloquent模型中查找相同的行

时间:2014-08-22 20:11:33

标签: php laravel laravel-4 eloquent

我正在尝试查找具有相同数据的行。我无法完全理解sql如何工作,但我知道结果应该是什么样的:

USER__IP (as uip1) [
    id,
    ip,
    user_id,
    USER__IP (as uip2) [
        id,
        ip,
        user_id (where uip2.user_id != uip1.user_id)
    ]
]

解释;我有一个模型(USER__IP),我在上面简化了。许多用户可能共享相同的IP,我想知道谁。我在上面的parantheses中做了一些评论,说明我希望在哪里使用它。我希望它是可以理解的。

我想这需要写成两个查询,第一个选择所有USER__IP,另一个选择它的相关实体。我试过这样的事情:

class User extends Eloquent {
    public function userIp() {
        return $this->hasMany('UserIp');
    }
}

class UserIp extends Eloquent {
    public function identical() {
        return $this->hasMany('UserIp', 'ip', 'ip')->whereNotIn('user_id', array($this->user_id));
    }
}

// Run from the controller, and return the result.
$user = User::with(array('user_ips' => function ($query) {
    $query->with('identical');
}))->findOrFail($userId);

这不能提供所需的结果。不知何故,$this->user_idnull绑定到查询,我不明白为什么。

问题是;给定此模型,如何直接使用Eloquent或Query构建器生成所需结果?谢谢。

修改

我意识到我过程简化了程序。因此,我在上面的代码中添加了真实的控制器代码。

修改2

所以这个问题的最佳解决方案是做@ c-griffin提出的建议。由于他的解决方案在我的意见不完整,而不是用工作代码回答我自己的问题,我将在这里进行编辑并将他的答案标记为正确的:

class UserIp extends Eloquent {
    public function identical() {
        return $this->hasMany('UserIp', 'ip', 'ip');
    }
}

// Controller code
$user = User::findOrFail($userId);
$user->load(array('user_ips' => function ($query) use ($userId) {
        $query->with(array('identical' => function ($q) use ($userId) {
                $q->whereNotIn('user_id', array($userId));
            }));
    }));

谢谢你们的帮助。

2 个答案:

答案 0 :(得分:1)

我可能完全错过了你正在尝试做的事情,但这可能会奏效 保持您的关系尽可能简单,然后在where关闭中指定with()

class UserIp extends Eloquent {
    public function identical() {
        return $this->hasMany('UserIp', 'ip', 'ip');
    }
}

// in a controller method
UserIp::with(['identical' => function($query){
    $query->whereNotIn('user_id', array($this->user_id));
}])->get();

答案 1 :(得分:0)

$userIps = $userip = UserIp::get();
foreach ($userIps as $userIp)
{
    $userIp->load('identical');
}