标签: laravel-collection

雄辩的收集:计数和检测空

这可能是一个微不足道的问题,但我想知道Laravel是否建议某种方法来检查返回的Eloquent集合是否$result = Model::where(...)->get()为空,以及计算元素的数量.

我们目前正在使用!$result检测空结果,是否足够?至于count($result)它是否真的涵盖了所有情况,包括空洞的结果?

laravel eloquent laravel-4 laravel-collection

242
推荐指数
8
解决办法
26万
查看次数

如何合并两个雄辩的收藏?

我有一个问题表和一个标签表.我想从给定问题的标签中获取所有问题.因此,举例来说,我可能会在给定问题上附加标签"旅行","火车"和"文化".我希望能够获取这三个标签的所有问题.看起来棘手的是,问题和标签关系是Eloquent中定义为manyToMany的多对多关系.

我想过尝试合并问题集合如下:

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

它似乎不起作用.似乎没有合并任何东西.我正确地尝试了吗?另外,在Eloquent中,是否有更好的方法来获取多对多关系中的一行行?

php laravel eloquent laravel-collection

58
推荐指数
6
解决办法
8万
查看次数

Laravel从关系中汲取领域

我有一个卖方对象,其中有一个相关的用户.我需要填写LaravelCollective的一个选择,所以我需要做这样的事情:

{!! Form::selectGroup('seller_id', 'Seller', Seller::with('user')->pluck('user.first_name', 'id')->toArray(), null) !!}
Run Code Online (Sandbox Code Playgroud)

问题是我无法从关系中获取字段(user.first_name).

我该怎么做?

UPDATE

我想避免这样做......

<?php 
    $sellers = [];

    Seller::with('user')->get()->each(function ($seller) use (&$sellers) {
        $sellers[$seller->id] = $seller->user->first_name;
    });
?>
Run Code Online (Sandbox Code Playgroud)

php laravel laravel-collection laravelcollective

27
推荐指数
3
解决办法
3万
查看次数

如何访问Laravel集合对象中的第n个对象?

我有一个laravel集合对象.

我想在其中使用第n个模型.

我该如何访问它?

编辑:

我在laravel文档中找不到合适的方法.我可以在foreach循环中迭代集合,并在找到第n个项目时中断:

foreach($collection as $key => $object)
{
    if($key == $nth) {break;}
}
// $object is now the nth one
Run Code Online (Sandbox Code Playgroud)

但这看起来很混乱.

更简洁的方法是执行上述循环一次,并创建一个包含集合中所有对象的简单数组.但这似乎是不必要的重复.

laravel集合类文档中,有一个fetch方法,但我认为这会从匹配主键的集合中获取一个对象,而不是集合中的第n个.

php laravel laravel-collection

20
推荐指数
3
解决办法
2万
查看次数

Laravel 5.2采用Eloquent Model Collection中的多个属性

Laravel 5.2有很好的助手,我想用它们做以下事情:

我有Eloquent模型集合:

$lesson->users(); // returns Eloquent collection of 3 users
Run Code Online (Sandbox Code Playgroud)

pluck()函数会很有用,但它只能得到单个参数.但是我希望得到两个参数的输出,id并且name像这样:

[
1=>['id'=>10,'name'=>'Michael Dook'],
2=>['id'=>16,'name'=>'Henry Babcock'],
3=>['id'=>19,'name'=>'Joe Nedd']
]
Run Code Online (Sandbox Code Playgroud)

这有什么优雅的解决方案吗?

helpers laravel-collection laravel-5.2

18
推荐指数
6
解决办法
3万
查看次数

如何访问Laravel集合中的第n个项目?

我想通过刻意制作一个重复的问题来打破所有规则......

其他问题有一个公认的答案.它显然解决了问题,但它没有回答标题问题.

让我们从头开始 - 该first()方法实现如下:

foreach ($collection as $item)
    return $item;
Run Code Online (Sandbox Code Playgroud)

它显然比采用$collection[0]或使用其他建议的方法更健壮.

即使集合中有20个项目,也可能没有索引0或索引的15项目.为了说明这个问题,让我们从文档中取出这个集合:

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'desk'],
    ['product_id' => 'prod-200', 'name' => 'chair'],
]);

$keyed = $collection->keyBy('product_id');
Run Code Online (Sandbox Code Playgroud)

现在,我们是否有任何可靠的(最好是简洁的)方式来访问第n项$keyed

我自己的建议是:

$nth = $keyed->take($n)->last();
Run Code Online (Sandbox Code Playgroud)

但是这会给出错误的item($keyed->last())$n > $keyed->count().如果第n个项目存在并且null它不仅仅是first()表现,我们怎样才能得到第n个项目?

编辑

为了澄清,让我们考虑一下这个集合:

$col = collect([
    2 => 'a',
    5 => 'b',
    6 => 'c',
    7 => 'd']);
Run Code Online (Sandbox Code Playgroud)

第一项是$col->first().如何获得第二个? …

laravel laravel-collection

11
推荐指数
4
解决办法
1万
查看次数

Laravel集合sortBy没有生效

我正在尝试将来自多个数据库查询的结果进行组合和排序.

$events = collect();

$downedEvents = EventDowned::where('mission', $missionId)
   ->orderBy('mission_time', 'asc')
   ->get();

$events->push($downedEvents);

$getInOutEvents = EventGetInOut::where('mission', $missionId)
   ->orderBy('mission_time', 'asc')
   ->get();

$events->push($getInOutEvents);

$missileEvents = EventMissile::where('mission', $missionId)
   ->orderBy('mission_time', 'asc')
   ->get();

$events->push($missileEvents);

$flattenedEvents = $events->flatten();
$sortedEvents = $flattenedEvents->sortBy('mission_time');

return $sortedEvents->all();
Run Code Online (Sandbox Code Playgroud)

结果如下:

SS

正如您所看到的,它已正确组合结果,但它们仍保留在原始查询顺序中,而不是已排序.

我也试过了

$sortedEvents = $flattenedEvents->sortBy(function($event) {
    return (int) $event->mission_time;
});
Run Code Online (Sandbox Code Playgroud)

php laravel eloquent laravel-5 laravel-collection

10
推荐指数
2
解决办法
4435
查看次数

如何检查某些东西是否可数?

我有一个var : $a. 我不知道它是什么.我想检查一下是否可以算数.通常,只有数组,我可以这样做:

if (is_array($a)) {
    echo count($a);
}
Run Code Online (Sandbox Code Playgroud)

但其他一些事情是可数的.让我们说Illuminate\Support\CollectionLaravel是可数的:

if ($a instanceof \Illuminate\Support\Collection) {
    echo count($a);
}
Run Code Online (Sandbox Code Playgroud)

但是有两件事情在一起做(并且可能与其他一些可数实例一起工作).就像是:

if (is_countable($a)) {
    echo count($a);
}
Run Code Online (Sandbox Code Playgroud)

这种功能存在吗?我错过了什么?

php arrays laravel laravel-collection

9
推荐指数
2
解决办法
7431
查看次数

向 Eloquent Collection 添加新属性

尝试将新属性添加到现有集合并访问它。

我需要的是这样的:

$text = Text::find(1);  //Text model has properties- id,title,body,timestamps
$text->user = $user;
Run Code Online (Sandbox Code Playgroud)

并通过访问用户,$text->user.

探索文档和 SO,我找到了put, prepend,setAttribute方法来做到这一点。

$collection = collect();
$collection->put('a',1);
$collection->put('c',2);
echo $collection->c; //Error: Undefined property: Illuminate\Support\Collection::$c
Run Code Online (Sandbox Code Playgroud)

再次,

$collection = collect();
$collection->prepend(1,'t');
echo $collection->t = 5; //Error: Undefined property: Illuminate\Support\Collection::$t
Run Code Online (Sandbox Code Playgroud)

$collection = collect();
$collection->setAttribute('c',99); // Error: undefined method setAttribute
echo $collection->c;
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?

laravel eloquent laravel-5 laravel-collection

7
推荐指数
1
解决办法
3万
查看次数

检查该元素在集合中依次出现

我有一个通过hasMany-relation从数据库返回的集合。

$items = collect([
    [
        'ref' => 'efaef954',
        'children' => collect([
            [
                'ref' => 'wetk4',
                'order' => 1,
            ],
            [
                'ref' => 'wetk5',
                'order' => 2,
            ],
            [
                'ref' => 'wetk6',
                'order' => 3,
            ],
        ]),
    ],
    [
        'ref' => 'efgjlf954',
        'children' => collect([
            [
                'ref' => 'wetk5',
                'order' => 1,
            ],
            [
                'ref' => 'wetk6',
                'order' => 2,
            ],
            [
                'ref' => 'wetk4',
                'order' => 3,
            ],
        ]),
    ],
]);
Run Code Online (Sandbox Code Playgroud)

$items-collection 可以包含任意数量的带有子项的项目。这些孩子有一个特定的顺序,在它们被排序之前是随机的。

在我的用户界面中,我可以输入子项的引用以获取符合条件的父项。只有具有我输入的特定顺序的父项,例如wetk4, …

laravel eloquent laravel-collection

6
推荐指数
1
解决办法
119
查看次数