我有来自两个不同表的2个查询。第一个包含我想在第二个查询中使用的ID。现在我这样做。我将ID提取到一个新数组中,然后在第二个查询中的->whereIn()
中使用此数组。
$campaign = DB::connection('mysql2')->table('mc_spots')
->select('s_customer', 's_product', 'spotid')
->where('s_starttermin', '>=', date("Y-m-d", strtotime($dateFrom)))
->where('s_lastrun', '<=', date("Y-m-d", strtotime($dateUntil)))
->where('s_media', '=', $media)
->where(function ($query) use ($products) {
for ($i = 0; $i < count($products); $i++) {
$query->orwhere('s_product', '=', $products[$i]);
}
})
->get();
$campaignID = [];
foreach ($campaign as $c) {
array_push($campaignID, $c->spotid);
}
$table = DB::connection('mysql2')->table('schaltdaten_tv_de')
->select('*')
->join('epgdata_channel', 'schaltdaten_tv_de.cid', '=', 'epgdata_channel.channelid')
->join('mc_spots', 'schaltdaten_tv_de.ReferenceDescription', '=', 'mc_spots.spotid')
->whereIn('ReferenceDescription', $campaignID)
->groupBy('epgdata_2013.id')
->orderBy('StartofBreak', 'ASC')
->limit(500)
->get();
有没有更方便的方法来执行此操作而不循环遍历$campaign
的每个项目?
答案 0 :(得分:1)
你可以这样做
$campaignID = $campaign->pluck('spotid');
Pluck doc:
pluck方法检索给定键的所有值
正如Sagar所说,它检索了一个数组,这是我们->whereIn()
的第二个参数
答案 1 :(得分:1)
您需要从第一个查询中获取id
,该查询会为您提供ID数组,您可以在第二个查询中使用它。
$campaign = DB::connection('mysql2')->table('mc_spots')
->select('s_customer', 's_product', 'spotid')
->where('s_starttermin', '>=', date("Y-m-d", strtotime($dateFrom)))
->where('s_lastrun', '<=', date("Y-m-d", strtotime($dateUntil)))
->where('s_media', '=', $media)
->where(function ($query) use ($products) {
for ($i = 0; $i < count($products); $i++) {
$query->orwhere('s_product', '=', $products[$i]);
}
})
->pluck('spotid');
现在,在spot id
秒中使用whereIn
数组,
$table = DB::connection('mysql2')->table('schaltdaten_tv_de')
->select('*')
->join('epgdata_channel', 'schaltdaten_tv_de.cid', '=', 'epgdata_channel.channelid')
->join('mc_spots', 'schaltdaten_tv_de.ReferenceDescription', '=', 'mc_spots.spotid')
->whereIn('ReferenceDescription', $campaign)
->groupBy('epgdata_2013.id')
->orderBy('StartofBreak', 'ASC')
->limit(500)
->get();
希望你理解
答案 2 :(得分:1)
您可以使用array_column()
来完成此操作喜欢这个
$campaignID=array_column($campaign,'spotid')
确保$campaign
必须是数组。如果它是对象,则将其转换为数组,如json_decode(json_encode($campaign),true)
为了exapmle
$t='[{"id":49},{"id":61},{"id":5},{"id":58}]' ;
array_column(json_decode($t,true),'id')
它将输出为
答案 3 :(得分:0)
由于您已经在第二个查询中加入了mc_spots
表,因此您可以随时在第一个查询中添加相同的约束:
$table = DB::connection('mysql2')->table('schaltdaten_tv_de')
->select('*')
->join('epgdata_channel', 'schaltdaten_tv_de.cid', '=', 'epgdata_channel.channelid')
->join('mc_spots', 'schaltdaten_tv_de.ReferenceDescription', '=', 'mc_spots.spotid')
->where('mc_spots.s_starttermin', '>=', \Carbon\Carbon::parse($dateFrom))
->where('mc_spots.s_lastrun', '<=', \Carbon\Carbon::parse($dateUntil))
->where('mc_spots.s_media', $media)
->whereIn('s_product', $products)
->groupBy('epgdata_2013.id')
->orderBy('StartofBreak', 'ASC')
->limit(500)
->get();
希望这有帮助!