1
votes

I have multiple columns which is saved with a suffix ended with the index of 1-12, such as savings_date_mth_1 until savings_date_mth_12. As of now, I would like to display this value on blade using for loop, but it cannot read the name of the column when I name it such as below.

@for ($i = 1; $i <= $savings->months_diff; $i++)
<div class="p-4 bg-gray-200 shadow-md hover:shadow-xl rounded-lg">
    <div class="text-center text-gray-600 mb-2 underline">
        {{ $savings->savings_date_mth_.$i }}
        {{ \Carbon\Carbon::parse($savings->savings_date_mth_.$i)->format('M') }} Savings
    </div>
    <div>
        Cost Item: 100
    </div>
</div>
@endfor

I have tried using {$i} as well but it's not showing the value of the column still. Please enlighten me on this particular issue and what is the best practice for this.

1
echo $savings->{savings_date_mth_.$i} - Shibon
@Shibon That works, but does trigger a PHP warning: "PHP Warning: Use of undefined constant savings_date_mth_ - assumed 'savings_date_mth_' (this will throw an Error in a future version of PHP) in Psy Shell code on line 1" - $savings->{'savings_date_mth_' . $i} is what it ends up doing, but just be aware 🙂 - Tim Lewis

1 Answers

1
votes

You need to use savings_date_mth as a String, and interpolate or concatenate $i to it.

In PHP, you can use a String to access a property of an Object like this:

$string = 'something';
$object = (object)['something' => 'another'];
{{ $object->{$string} }} // 'another'

But in your case, you're constructing the String from a variable as well:

$i = 1;
$j = 2;
$savings = (object)['savings_date_mth_1' => 100, 'savings_date_mth_2' => 200]);
{{ $savings->{"savings_date_mth_{$i}"} }} // 100
{{ $savings->{"savings_date_mth_{$j}"} }} // 200

So in the end, your code would look like:

@for ($i = 1; $i <= $savings->months_diff; $i++)
<div class="p-4 bg-gray-200 shadow-md hover:shadow-xl rounded-lg">
    <div class="text-center text-gray-600 mb-2 underline">
        {{ $savings->{"savings_date_mth_{$i}"} }}
        {{ \Carbon\Carbon::parse($savings->{"savings_date_mth_{$i}"})->format('M') }} Savings
    </div>
    <div>
        Cost Item: 100
    </div>
</div>
@endfor

Alternatively, via concatenation:

{{ $savings->{'savings_date_mth_' . $i} }}
{{ \Carbon\Carbon::parse($savings->{'savings_date_mth_' . $i})->format('M') }} Savings

Whichever you prefer, or is consistent with other usage in your project, if any.