[SOLVED] Get laravel relations value as attribute

Issue

This Content is from Stack Overflow. Question asked by Don Don Don

I have two models, Portal and Tag and relation many-to-many between them with extra database portal_tag. All working great and I can access to portal->tag without problem.

But my goal is to get this model like “all values from model” and all relations value as one attribute, between commas. Is it possible?

Because I need it inside PortalsExport class in this form to use in export into CSV libary.

Now its look like this:

Portal::with('tags')
  ->select('url','type','topic','description','prohibited','visits','facebook_url','twitter_url','instagram_url')
  ->where('user_id', Auth::id())->get();

I have no idea how to make tags.name same as all other options from select.



Solution

If you want to get tags relations as comma separated string then One approach is, You will need to define a accessor in your Portal model which will append you tags array into string. like once I was did in one of my project:

Step 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))
        );
    }

In above closure functions, plz verify yourself that you tag name value is available in $k or $v variable.

Step 2:

add that accessor in Portal model append array like that:

 protected $appends = [      
        'tags_as_string',
    ];

Step 3:

In the result of yours below query you will get tags_as_string attribute which contains comma separated 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();

If tags_as_string shown empty then try it above query without select() clause.


This Question was asked in StackOverflow by Don Don Don and Answered by khawar Ali It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?