#Is it possible to display key : value in a TextColumn ?

6 messages · Page 1 of 1 (latest)

frank marsh
#

Hi all,

is it possible for a TextColumn to display the key and the value when the DB field is an array?
TextColumn always returns a string without the keys.

I have that in my DB :

{"panel": "admin", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"}

And I want to display that in my table :

• panel : admin
• user_agent : Mozilla/5.0 (Windows NT 10...

For that I try this :


TextColumn::make('properties')
 ->label('Détails')
 ->getStateUsing(fn($record) => $record->properties)
 ->listWithLineBreaks()
 ->bulleted()
 ->wrap()
 ->toggleable()
 ->html(),

But in the end all I get is this without the keys:

• admin
• Mozilla/5.0 (Windows NT 10...

If I DD $record->propreties, I get my array :

array:2 [▼ // xxx.php:175
  "panel" => "admin"
  "user_agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"
]

Thanks for your help 🙂

cf. : https://www.answeroverflow.com/m/1176827225736224838

Hi i have Variant model whre i save json in format like this {"Name":"Value"} and i'm casting it

    protected $casts = [
        'variant_attributes_json' => 'array',
    ];

How could i display key into textcolumn or other column?
Because if i put it into textCol it in state is only value

  Tables\Columns\TextColumn::make('v...
thorny crystalBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> ✅ Mark Solution

opal oracle
#
->formatStateUsing(function($record) {
  if($record->properties) {
    $values = '';
    foreach($record->properties as $key => $property) {
        $values = $key . : . $property .'<br/>';
    }   
  }
})

quick rough solution that should work.

frank marsh
#

Hi, thanks for your help 🙂
Based on your solution, I managed to get the desired result with that:

TextColumn::make('properties')
  ->label('Détails')
  ->formatStateUsing(function ($record) {
      if (is_array($record->properties)) {
          $formattedState = '<ul class="list-disc">';
          foreach ($record->properties as $key => $value) {
              $formattedState .= "<li><strong>{$key} :</strong> {$value}</li>";
          }
          $formattedState .= '</ul>';

          return $formattedState;
      }

      return $record->properties;
  })
  ->wrap()
  ->toggleable()
  ->html(),

->getStateUsing(fn($record) => $record->properties) method seems unnecessary in this case.
So everything's good, I just have the impression that it's not very clean, I don't know why. 😅

Anyway, thanks for everything 😉

thorny crystalBOT
opal oracle
#

formatStateUsing is just called in the rendering method, opposed to getStateUsing which would call it for each record to get the state. If there are no proerties, then formatStateUsing isn't run.