我在Laravel中有类别和子类别
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';
public function parent()
{
return $this->belongsTo('App\Category', 'parent_id');
}
public function children()
{
return $this->hasMany('App\Category', 'parent_id');
}
}
我可以添加一个新类别,它属于已经创建的类别。类似于“测试->测试子类别”,然后假设我将创建属于“测试子类别”的“测试子类别”,如下所示:“测试->测试子类别->测试子类别”
在视图中,我想打印类别的父项(如果有)。
我这样做是这样的:
@if($category->parent)
<td>{{ $category->parent->name }} <strong>-></strong> {{ $category->name }}</td>
@else
<td>{{ $category->name }}</td>
@endif
但这仅显示一个父类别(“测试的子类别->测试的子子类别”)。我想显示所有如下所示的父项:“测试->测试子类别->测试子子类别”
我怎样才能做到这一点?
参考方案
您可以在Cateory
模型上定义一个模型访问器,该模型访问器将检索所有父级并将其放入集合中。因此,在您的Category
模型中添加以下方法:
public function getParentsAttribute()
{
$parents = collect([]);
$parent = $this->parent;
while(!is_null($parent)) {
$parents->push($parent);
$parent = $parent->parent;
}
return $parents;
}
然后在刀片模板中,您可以获取类别的所有父项
@if(count($category->parents))
<td>{{ $category->parents->implode('-') }} <strong>-></strong> {{ $category->name }}</td>
@else
<td>{{ $category->name }}</td>
@endif
除了递归检索所有父母和@Ross Wilson在评论中建议的软件包外,我没有其他解决方案。考虑到查询的数量将等于父类别的数量。
您可以做的另一件事是将父树设置到categories
表中的数据库中,以节省大量查询。在您的categories
表中添加一个字符串字段,例如parents_tree
,并在保存/更新时将此值与已经连接的父级名称一起设置。这有点脏,因为如果其中一位父母更改了名字,则必须相应地更新所有孩子。由您决定要权衡的选择。
举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…
php:将分钟取整到最近的四分之一小时,然后执行更多操作 - php最初的问题是这样的:取分钟数->转换为四分之一小时-> 1个四分之一小时为1个单位->输出单位我今天整天都在整理页面,几分钟前我的大脑就停止工作了,我只是不知道如何输出单位数量。我知道在此网站上发布问题会有所帮助。因此,用户输入的分钟数(不是小时和分钟,而是数分钟),站点需要输出单位数量。单位是一个刻钟。分钟总是四舍五入到最近的四分之一小时…
PHP OOP概念付诸实践 - php目前,我所拥有的是一份以程序庄园形式编写的审查表。我想更改一些内容,并希望在此过程中,根据过去的经验,在OOP中,网站的整个审核部分会更好。数据流如下:HTML表单=>提交=> jQuery验证=>? => PHP验证=>添加记录我的问题是要了解将POST数据传递给类的正确方法是使用AJAX / jQuery或使用具有标准感谢页…
PHP:检查谁看过发送的电子邮件? - php我正在向某些用户发送电子邮件,并且想知道是谁阅读的,这意味着如果有人阅读了该电子邮件,则将维护一个日志文件,其中包含该用户的电子邮件地址以及日期/时间/ IP。为此,我发送一个带有电子邮件(html模板)的javascript函数,当用户打开该电子邮件时,它仅会警告用户的电子邮件地址,例如:for($n=0; $n<sizeof($checkBox);…
PHP:填写数组中的“空白” - php我有一个php数组(通过表单中的复选框值获取-您知道复选框仅在未设置时显示在_POST变量中)。Array ( [2] => 0,2 [3] => 0,3 ) 我需要一种方法来“填补” 0-5之间的差距。所以上面看起来像(用'-1'填充空白。我尝试用填充有'-1'的数组array_merge(),但这没用。Array ( [0] => -1…