【发布时间】:2018-04-23 07:50:25
【问题描述】:
我的 Eloquent 模型 Candidate 中有以下范围,让我获取一个集合,其中每个项目都具有与集合 $fields 和 $categories 匹配的关系。
也就是说,它让我得到一个包含所有$fields 和$categories 的候选人集合。
class Candidate extends Model {
public function scopeMatching($query, $fields, $categories ) {
return $query->get()->filter( function ( $candidate ) use ( $categories, $fields ) {
$outcome = false;
foreach ($categories as $category){
$outcome = $candidate->categories->contains( $category );
}
foreach ($fields as $field){
$outcome = $candidate->fields->contains( $field );
}
return $outcome;
});
}
public function user() {
return $this->belongsTo( User::class );
}
public function jobs() {
return $this->belongsToMany(Job::class);
}
public function categories() {
return $this->belongsToMany(Category::class);
}
public function fields() {
return $this->belongsToMany(Field::class);
}
}
测试方法的使用示例:
// Pick 2 random categories
$categories = Category::all()->random( 2 );
// Pick 5 random fields.
$fields = Field::all()->random( 5 );
// Pick a random candidate.
$candidate = Candidate::all()->random();
// Attach categories and fields to candidate.
$candidate->categories()->attach( $categories );
$candidate->fields()->attach( $fields );
// Filter candidates to get only matching ones.
$candidates = Candidate::with(['fields','categories'])->matching($fields, $categories);
它工作正常,但我想知道这是否是最好的方法。不使用两个foreach 循环,有没有更好、更“雄辩”的方法?
【问题讨论】:
-
我不认为
scopeMatching做你认为它做的事。它只会实际检查字段数组中的最后一个字段是否为关系。 -
真的!我没有注意到这一点。干杯:)
标签: php laravel model eloquent