我有两个模型,
Portal
和Tag
以及它们之间的关系many-to-many
和额外的数据库portal_tag
。一切都很好,我可以毫无问题地访问portal->tag
。
但我的目标是让这个模型像“模型中的所有值”一样,并且所有关系值作为一个属性,在逗号之间。可以吗?
因为我需要它在
PortalsExport
类中以这种形式导出到 CSV 库中使用。
现在看起来像这样:
Portal::with('tags')
->select('url','type','topic','description','prohibited','visits','facebook_url','twitter_url','instagram_url')
->where('user_id', Auth::id())->get();
我不知道如何使
tags.name
与select
中的所有其他选项相同。
我正在使用 Laravel9 和 PHP8。
如果您想以逗号分隔的字符串形式获取
tags
关系,那么一种方法是,您需要在 accessor
模型中定义一个 Portal
,它将把您 tags array
附加到 string
中。就像我在我的一个项目中所做的那样:
public function getTagsAsStringAttribute(): string
{
$array = $this->tags->pluck('name')->all();
return implode(", ",
array_map(function ($k, $v) {
return $k;
}, array_keys($array), array_values($array))
);
}
在上面的闭包函数中,请自行验证您的
值在tag name
变量中可用。$k or $v
在
accessor
模型 Portal
数组中添加 append
,如下所示:
protected $appends = [
'tags_as_string',
];
在下面的查询结果中,您将获得
tags_as_string
属性,其中包含逗号分隔的标签作为字符串。
Portal::with('tags')
->select('url','type','topic','description','prohibited','visits','facebook_url','twitter_url','instagram_url')
->where('user_id', Auth::id())->get();
如果
显示为空,则在不带tags_as_string
子句的情况下尝试上面的查询。select()