你可以这样做
Head::whereIn('id', $head_id_array)->load(['wig' => function($query) use ($wig_type) {
$query->where('type', $wig_type);
}])->get();
或
Wig::where('type', $wig_type)->load(['heads' => function($query) use ($head_id_array) {
$query->whereIn('id', $head_id_array);
}])->get();
如果我正确理解您的问题。
或者
$wig = Wig::where('type', $wig_type)->get();
$heads = $wig->heads()->whereIn('id', $head_id_array)->get();
$matching_head_ids = $heads->lists('id');
$wig->matching_head_ids = $matching_head_ids;
这样,返回的 wig 对象将有一个匹配的头部 id 数组。
你可以把它放在你的假发模型的方法中:
class Wig extends Eloquent {
public function heads()
{
return $this->belongsToMany('Head');
}
/**
* @param array $head_ids Provided head id array
* @return array Array of this wigs head id's which match the provided head ids
*/
public function matchingHeadIds($head_ids)
{
return $this->heads()->whereIn('id', $head_ids)->get()->lists('id');
}
}
然后像这样使用它
$wig = Wig::where('type', $wig_type);
$wig->matchingHeadIds($head_ids);
编辑
对于像 eloquent 这样的 ORM 来说,这不是一项简单的任务,因为它将每条记录都视为表中的一行,所以这样的事情是行不通的:
$wigs = Head::whereIn('id', $head_ids)->wigs()->where('type', $wig_type)->get();
有一个whereHas 方法可用,您可以像这样使用它:
Wig::where('type', $wig_type)->whereHas('heads', function ($query) use ($head_ids) {
$query->whereIn('id', $head_ids);
})->get();
这应该会给你你需要的结果。