如何合并两个雄辩的集合?

我有一个问题表和一个标签表。我想从给定问题的标签中提取所有问题。因此,例如,我可能有标签“旅行”,“火车”和“文化”附加到给定的问题。我希望能够获得这三个标签的所有问题。问题和标签之间的关系在 Eloquent 中定义为多对多关系(many-to-many) ,这似乎是一个棘手的问题。

我想过试着合并这些问题,集合如下:

foreach ($question->tags as $tag) {
if (!isset($related)) {
$related = $tag->questions;
} else {
$related->merge($tag->questions);
}
}

不过好像没什么用。看起来什么都不合并。我这样做对吗?还有,在雄辩中是否有更好的方法来获取多对多关系中的一行?

221451 次浏览

Collection上的 merge()方法不修改调用它的集合。中合并的新数据返回一个新集合。你需要:

$related = $related->merge($tag->questions);

然而,我认为你从错误的角度处理这个问题。

因为您正在寻找符合特定标准的问题,所以以这种方式查询可能会更容易。has()whereHas()方法用于根据相关记录的存在生成查询。

如果您只是在寻找带有任何标签的问题,那么可以使用 has()方法。因为您正在寻找带有特定标记的问题,所以可以使用 whereHas()来添加条件。

因此,如果你想要所有的问题,至少有一个标签与“旅行”,“火车”,或“文化”,您的查询将看起来像:

$questions = Question::whereHas('tags', function($q) {
$q->whereIn('name', ['Travel', 'Trains', 'Culture']);
})->get();

如果您希望所有的问题都包含这三个标签,那么您的查询将如下所示:

$questions = Question::whereHas('tags', function($q) {
$q->where('name', 'Travel');
})->whereHas('tags', function($q) {
$q->where('name', 'Trains');
})->whereHas('tags', function($q) {
$q->where('name', 'Culture');
})->get();

Merge 方法返回合并的集合,它不会改变原始集合,因此您需要执行以下操作

$original = new Collection(['foo']);


$latest = new Collection(['bar']);


$merged = $original->merge($latest); // Contains foo and bar.

将该示例应用于代码

$related = new Collection();


foreach ($question->tags as $tag)
{
$related = $related->merge($tag->questions);
}

将两个不同的雄辩的集合合并到一个中,一些对象碰巧具有相同的 id,其中一个将覆盖另一个。使用 push ()方法,或者重新考虑解决问题的方法,以避免出现这种情况。 参考网页

$users = User::all();
$associates = Associate::all();


$userAndAssociate = $users->merge($associates);

所有的都不适合我在 雄辩的收藏品上工作,Laravel 雄辩的集合使用的关键从项目 我觉得导致合并的问题,你需要得到第一个集合作为一个数组回来,把它放入一个新的集合,然后把其他到新的集合;

public function getFixturesAttribute()
{
$fixtures = collect( $this->homeFixtures->all() );
$this->awayFixtures->each( function( $fixture ) use ( $fixtures ) {
$fixtures->push( $fixture );
});
return $fixtures;
}

创建一个新的基础集合为每个雄辩的集合合并为我工作。

$foo = collect(Foo::all());
$bar = collect(Bar::all());
$merged = $foo->merge($bar);

在这种情况下,它的主键不会有冲突。

我想补充一点,我发现 concat 方法似乎不会根据 ID 重写,而 merge 方法会。Concat 似乎对我有用,而合并造成了问题。

我在使用 merge 时遇到了一些问题。所以我使用了 concat。你可以像下面这样使用它。

$users = User::all();
$associates = Associate::all();
$userAndAssociate = $users->concat($associates);

对此我很抱歉,但是自从 PHP 7.4以来,您可以这样做(最好使用 merge)。

$foo = Foo::all();
$bar = Bar::all();


/** $foo will contain $foo + $bar */
$foo->push(...$bar);