这可能是一个微不足道的问题,但我想知道Laravel是否建议某种方法来检查返回的Eloquent集合是否$result = Model::where(...)->get()为空,以及计算元素的数量.
我们目前正在使用!$result检测空结果,是否足够?至于count($result)它是否真的涵盖了所有情况,包括空洞的结果?
我有一个问题表和一个标签表.我想从给定问题的标签中获取所有问题.因此,举例来说,我可能会在给定问题上附加标签"旅行","火车"和"文化".我希望能够获取这三个标签的所有问题.看起来棘手的是,问题和标签关系是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中,是否有更好的方法来获取多对多关系中的一行行?
我有一个卖方对象,其中有一个相关的用户.我需要填写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) 我有一个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个.
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)
这有什么优雅的解决方案吗?
我想通过刻意制作一个重复的问题来打破所有规则......
在其他问题有一个公认的答案.它显然解决了问题,但它没有回答标题问题.
让我们从头开始 - 该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().如何获得第二个? …
我正在尝试将来自多个数据库查询的结果进行组合和排序.
$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)
结果如下:

正如您所看到的,它已正确组合结果,但它们仍保留在原始查询顺序中,而不是已排序.
我也试过了
$sortedEvents = $flattenedEvents->sortBy(function($event) {
return (int) $event->mission_time;
});
Run Code Online (Sandbox Code Playgroud) 我有一个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)
这种功能存在吗?我错过了什么?
尝试将新属性添加到现有集合并访问它。
我需要的是这样的:
$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)
有什么帮助吗?
我有一个通过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, …