Laravel中使用pluck获取多元素异常问题咨询
问题分析与解决方案
首先咱们来拆解下你遇到的两个问题:
为什么 where('id','=',$sale->pluck('id_location')) 只返回一条数据?
$sale->pluck('id_location') 返回的是一个Eloquent Collection对象,而当你把集合直接传给 where 的等于条件时,Laravel会默认取集合的第一个元素作为匹配值,所以只会匹配第一个id_location对应的Location,自然只能拿到一条数据。这是等于条件的特性——它只能匹配单个值,而不是一组值。
为什么 whereIn 能拿到两条数据,但看起来和Tour的ID不匹配?
这是因为你当前的查询逻辑是:先查出所有符合条件的Tour,再把这些Tour的id_location全部取出来,一次性查询所有对应的Location。但这种方式只是拿到了所有相关Location的集合,并没有建立Tour和Location之间的对应关系——你没法直接知道哪个Location属于哪个Tour,所以才会觉得“不匹配”。
最优解决方案:用Eloquent关联重构查询
Laravel的Eloquent关联就是为了解决这种跨模型关联查询的问题,既高效又能保证数据对应准确,还能避免N+1查询问题。
第一步:定义模型间的关联关系
在你的Tour模型里添加两个关联方法:
// app/Models/Tour.php public function package() { // 假设Tour表的id_package字段对应Package表的id字段 return $this->belongsTo(Package::class, 'id_package'); } public function location() { // 假设Tour表的id_location字段对应Location表的id字段 return $this->belongsTo(Location::class, 'id_location'); }
第二步:修改getPackage方法,使用预加载查询
public function getPackage($type) { // 预加载关联的package和location,一次性查询所有需要的数据 $sales = Tour::where('id_package', $type) ->with(['package', 'location']) ->get(); return view('page.package', compact('sales')); }
第三步:在视图中直接访问关联数据
现在每个$sale对象都自带了对应的package和location,直接遍历就能拿到对应关系明确的数据:
@foreach($sales as $sale) <div> <h3>Tour ID: {{ $sale->id }}</h3> <p>所属套餐:{{ $sale->package->name }}</p> <!-- 替换成你的Package表字段 --> <p>所属地点:{{ $sale->location->name }}</p> <!-- 替换成你的Location表字段 --> </div> @endforeach
如果你不想用关联(不推荐)
如果暂时不想改模型关联,也可以手动给每个Tour绑定对应的Location,但这种方式会产生N+1查询(每个Tour都要单独查一次Location),性能较差:
public function getPackage($type) { $sales = Tour::where('id_package', $type)->get(); // 给每个Tour绑定对应的Location $sales->each(function ($sale) { $sale->location = Location::find($sale->id_location); $sale->package = Package::find($sale->id_package); }); return view('page.package', compact('sales')); }
内容的提问来源于stack exchange,提问作者Quan Nguyen
相关产品推荐
相关产品推荐

