获取 Laravel 关系值作为属性

问题描述 投票:0回答:1

我有两个模型,

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。

php laravel eloquent maatwebsite-excel
1个回答
1
投票

如果您想以逗号分隔的字符串形式获取

tags
关系,那么一种方法是,您需要在
accessor
模型中定义一个
Portal
,它将把您
tags array
附加到
string
中。就像我在我的一个项目中所做的那样:

步骤1:

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
变量中可用。

第2步:

accessor
模型
Portal
数组中添加
append
,如下所示:

 protected $appends = [      
        'tags_as_string',
    ];

步骤3:

在下面的查询结果中,您将获得

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()
子句的情况下尝试上面的查询。

© www.soinside.com 2019 - 2024. All rights reserved.