我正在尝试查找具有相同数据的行。我无法完全理解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_id
被null
绑定到查询,我不明白为什么。
问题是;给定此模型,如何直接使用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));
}));
}));
谢谢你们的帮助。
答案 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');
}