【发布时间】:2015-10-04 10:51:43
【问题描述】:
突然间我遇到了我自己无法解决的问题。我写了查询,它返回了一些数据:
$users = User::whereIn('users.status', array(2,3))
->leftJoin('firsts', 'firsts.user_id', '=', 'users.id')
->leftJoin('seconds', 'seconds.user_id', '=', 'users.id')
->leftJoin('thirds', 'thirds.user_id', '=', 'users.id')
->leftJoin('offers', 'offers.user_id', '=', 'users.id')
->where(function($query){
$query->where('users.status', '=', '2');
$query->where('firsts.status', '=', 'approved');
$query->where('seconds.status', '=', 'approved');
$query->where('offers.user_id', '=', 'approved');
})
->orWhere(function($query){
$query->where('users.status', '=', '3');
$query->where('users.stripe_active', '=', '1');
$query->where('firsts.status', '=', 'approved');
$query->where('seconds.status', '=', 'approved');
$query->where('thirds.status', '=', 'approved');
$query->where('offers.status', '=', 'approved');
})
->get();
我期待一个简单的对象作为查询的返回。目前,我的 users 表中有一个正确的记录,但是这个查询向我返回了 6 次该对象,我不明白为什么。
我期望的结果:
Collection {#353 ▼
#items: array:1 [▼
0 => User {#354 ▼
#dates: array:2 [▶]
#table: "users"
#fillable: array:3 [▶]
#hidden: array:2 [▶]
+admin: "eval.butkus@gmail.com"
+admin2: "Evaldas"
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:31 [▼
"id" => 1
"username" => "evaldas"
"password" => "$2y$10$ARTGHBTqIl/X6UsblylF5ugMPFlASwDKUEVbS5Nh3TjtycGG/NU7."
"email" => "eval.butkus@gmail.com"
"remember_token" => "A42ezMckkvjCLrpj4jxyHf2iSQWp3iAGfzGoTqMygDimFSzXNx6FW42qCOhP"
"name" => ""
"subscribe" => 0
"profile_picture" => "VNlQxOlCbXkCGEQ6ZdFS1pbK2tixhsmmhQPhLNLMBRKqDzXegWbqQiJOsplMADKg.jpg"
"about_you" => ""
"writing_service" => 0
"f_card" => 0
"logo" => ""
"website" => ""
"youtube" => ""
"status" => 3
"code" => ""
"active" => 1
"address" => ""
"phone" => ""
"news" => 0
"terms" => 1
"radius" => 0
"created_at" => "2015-07-13 10:26:47"
"updated_at" => "2015-07-15 10:25:30"
"stripe_active" => 1
"stripe_id" => "cus_6c0xE8OxR7fdXJ"
"stripe_subscription" => "sub_6c0x4RzEoBplCb"
"stripe_plan" => "small"
"last_four" => "4242"
"trial_ends_at" => null
"subscription_ends_at" => null
]
#original: array:31 [▶]
#relations: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
}
]
}
我得到的结果:
Collection {#364 ▼
#items: array:6 [▼
0 => User {#365 ▼
#dates: array:2 [▶]
#table: "users"
#fillable: array:3 [▶]
#hidden: array:2 [▶]
+admin: "eval.butkus@gmail.com"
+admin2: "Evaldas"
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:53 [▼
"id" => 2
"username" => "evaldas"
"password" => "$2y$10$ARTGHBTqIl/X6UsblylF5ugMPFlASwDKUEVbS5Nh3TjtycGG/NU7."
"email" => "sadsad"
"remember_token" => "A42ezMckkvjCLrpj4jxyHf2iSQWp3iAGfzGoTqMygDimFSzXNx6FW42qCOhP"
"name" => "sadsa"
"subscribe" => 0
"profile_picture" => "VNlQxOlCbXkCGEQ6ZdFS1pbK2tixhsmmhQPhLNLMBRKqDzXegWbqQiJOsplMADKg.jpg"
"about_you" => ""
"writing_service" => 0
"f_card" => 0
"logo" => ""
"website" => "das"
"youtube" => ""
"status" => "approved"
"code" => ""
"active" => 1
"address" => "asfas"
"phone" => "dasd"
"news" => 0
"terms" => 1
"radius" => 0
"created_at" => "2015-07-15 07:31:37"
"updated_at" => "2015-07-15 07:44:31"
"stripe_active" => 1
"stripe_id" => "cus_6c0xE8OxR7fdXJ"
"stripe_subscription" => "sub_6c0x4RzEoBplCb"
"stripe_plan" => "small"
"last_four" => "4242"
"trial_ends_at" => null
"subscription_ends_at" => null
"country" => "Highland"
"mobile" => "asd"
"descripsion" => "Ddescription"
"landline" => "asdas"
"company_name" => "das"
"facebook" => "dsad"
"twitter" => "sadsa"
"linkedln" => "dsadasd"
"company_number" => "sad"
"google" => "sadasd"
"vat" => "asdsad"
"experience" => ""
"privacy" => 0
"user_id" => 1
"post_code" => "AB115QN"
"latitude" => "57.14270109"
"longitude" => "-2.093014619"
"identify" => "grEa6JEaj6P0I7Zc3ZCq5CADojzApSJZ.jpg"
"bill" => "N8WKjRlSttsHNt1crrNdwxG7uqWEg5GB.jpg"
"comment" => "asdsad"
"image" => "7dmURWxbzO4pinqbek0yzdIKqEyZrjOD.jpg"
"title" => "new offer"
]
#original: array:53 [▶]
#relations: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
}
1 => User {#366 ▶}
2 => User {#367 ▶}
3 => User {#368 ▶}
4 => User {#369 ▶}
5 => User {#370 ▶}
]
}
能否解释一下我是如何丢失表之间的所有关系的以及如何避免它?由于结果的结构发生了变化,我不能使用循环、关系等。谢谢!。
【问题讨论】:
-
6个用户都是同一个用户吗?
-
是的。我只是试图回显所有 user_id。都是一样的。
-
那么对于给定的用户,其中一个联接表必须有多个记录。这就是为什么我在上一个问题中询问它的原因,但是没有与用户链接的 Offers 表。
-
如果单个用户有多个优惠,并且您在用户模型中定义了“优惠”关系,请删除连接并执行 User::with('offers')->whereIn ... . 你应该得到一个用户,你将能够通过 $user->offers 访问优惠
-
现在更有意义了。我的三分之二表也很少有一个用户的记录 (hasMany),但我可以仅通过 users.thirds 的第一条记录来识别状态。我该如何处理?
标签: php mysql laravel join eloquent