Laravel:通过标签从集合中获取模型

3

我目前正在制作一个页面,用于选择下个工作日要订购的菜单。你可以在菜单1和菜单2之间进行选择。

为此,我创建了一个名为"菜单"的模型,在其中查询出本周不同的菜单。

$menus1 = Menu::where('date', '>=', $start->toDateString())
                ->where('date', '<=', $end->toDateString())
                ->where('menu_nr', '=', '1')
                ->orderByRaw('date asc')
                ->get();

$menus2 = Menu::where('date', '>=', $start->toDateString())
                ->where('date', '<=', $end->toDateString())
                ->where('menu_nr', '=', '2')
                ->orderByRaw('date asc')
                ->get();

现在我有两个菜单模型的集合。目标是在网页上再次查询这个集合,在那里我显示模型的数据。
例如:
$menus1->where('date',$date)->starter_name;
$menus1->where('date',$date)->main_name;

现在我遇到的问题是,我无法将它们取出来。它总是返回一个空的集合。

你使用的是哪个版本的Laravel?另外,在你的示例where('date',$date)中,你从哪里获取了$date - Rwd
我使用 Laravel 5.6.33。我从助手数组的索引中获取 $date。助手数组检查这一天是否只有一个菜单或两个菜单。 - GrameJunior
你需要在使用 ->get(); 后,就不能再添加任何查询。 - AG MBALLA
2
@AGMBALLA 不是对数据库的查询,而是对集合的查询,这是可能的:https://laravel.com/docs/5.6/collections#method-where - SergkeiM
$menus1->where('date',$date)->all() 返回了什么? - brombeer
它返回了一个空数组,但我找到了解决方法,请检查我的答案。 - GrameJunior
3个回答

1
我刚刚意识到,我需要将“日期”列与Carbon日期进行比较,因为数据类型是“日期”。所以我这样做了:
$menu = $menus1->where('date', \Carbon\Carbon::parse($date))->first();

首先,因为只有一个。 现在我可以使用以下代码获取数据:

$menu->starter_name
$menu->main_name

0

如果您正在尝试从集合中获取一个项目,请尝试以下方法:

$menus1->where('date',$date)->first()->starter_name;

请查看Laravel集合文档


where函数已经返回了一个空集合,尽管它明显是一个有效的值。 - GrameJunior
@GrameJunior 什么是 date 数据类型并展示 $date 的值。同时展示日期列的值。 - SergkeiM
日期列的数据类型为“日期”,其值格式为“2018-08-22”。$date的值是当前日期,格式为“2018-08-22”。 - GrameJunior
我明白了!谢谢@Froxz,你的数据类型问题让我重新思考了一下!请检查我的答案。 - GrameJunior

0

由于您正在使用Laravel的get()方法,因此应循环遍历菜单。

像这样:

foreach ($menus1 as $m1) {
    if ($m1->date != $date) continue;

    echo $m1->starter_name . ' ' . $m1->main_name;

}

foreach ($menus2 as $m2) {
    if ($m2->date != $date) continue;
    echo $m2->starter_name . ' ' . $m2->main_name;
}

更好的方法是使用过滤器方法,该方法使用给定的回调函数过滤集合,仅保留通过给定真实测试的项目。然后使用each()方法循环遍历它:

$menus1->filter(function ($m1) use ($date) {
    return $m1->date == $date;
})->each(function($m1) {
    echo $m1->starter_name . ' ' . $m1->main_name;
});

$menus2->filter(function ($m2) use ($date) {
    return $m2->date == $date;
})->each(function($m2) {
    echo $m2->starter_name . ' ' . $m2->main_name;
});

谢谢你的帮助,但我找到了一种更短的方法。请检查我的答案! - GrameJunior
哦,不错。我看到了。你做的可能是获取给定日期的第一条记录。我想我的回答是,如果你有多条给定日期的记录。 :) - kissartisan
任何一天都不会有第二个Menu1,所以我可以走更简单的路线。 - GrameJunior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接