Ticket.php.

public function getStatusAttribute()
{
    if ( $this->status == 0 ) {
        return ['label' => 'closed', 'bs_class' => 'badge badge-secondary'];
    }
    if ( $this->status == 1 ) {
        return ['label' => 'answered', 'bs_class' => 'badge badge-success'];
    }
    return ['label' => 'waiting', 'bs_class' => 'badge badge-warning'];
}

Bilet.blade.php

<td>
    @php $status = $ticket->status @endphp
    <span class="{{ $status['bs_class'] }}">
    {{ $status['label'] }}
  </span>
</td>

Migracja

public function up()
{
    Schema::create('tickets', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->cascadeOnDelete();
        $table->string('diaphragmUnit');
        $table->tinyInteger('status')->default(0);
        $table->text('message');
        $table->timestamps();
    });
}

Chcę pokazać label statusu biletów.

Ale mówi:

Niezdefiniowana właściwość: App\Ticket::$status

Edytuj

Kontroler

public function index()
{
    $tickets = Ticket::latest()->paginate(25);
    return view('Admin.tickets.index', compact('tickets'));
}
1
user16277300 28 czerwiec 2021, 11:15

4 odpowiedzi

Najlepsza odpowiedź

Musiałeś podać argument w akcesorze:

public function getStatusAttribute($status)
{
    if ( $status == 0 ) {
        return ['label' => 'closed', 'bs_class' => 'badge badge-secondary'];
    }
    if ( $status == 1 ) {
        return ['label' => 'answered', 'bs_class' => 'badge badge-success'];
    }
    return ['label' => 'waiting', 'bs_class' => 'badge badge-warning'];
}

Więc zmienisz również $this->status na po prostu $status

1
younis 28 czerwiec 2021, 11:13

Błąd nie ma nic wspólnego z plikiem migracji. W rzeczywistości pochodzi z punktu, w którym próbowałeś uzyskać dostęp

$bilet->status

W twoim ticket.blade.php. Powodem jest to, że w Twojej usłudze getStatusAttribute dane odpowiedzi nie mają właściwości „ticket”, zamiast tego wartość zwracana powinna być

    public function getStatusAttributeService()
        {
            if ( $this->status == 0 ) {
                $status = ['status'=> ['label' => 'closed', 'bs_class' => 'badge badge-secondary']];
            }
            if ( $this->status == 1 ) {
                $status = ['status'=>['label' => 'answered', 'bs_class' => 'badge badge-success']];
            }
            $status = ['status'=> ['label' => 'waiting', 'bs_class' => 'badge badge-warning']];

 return view('callYourViewHere',['ticket'=>$status]);
        }
  
0
Ezugudor 28 czerwiec 2021, 11:42

Wewnątrz metody getStatusAttribute musisz uzyskać dostęp do statusu z właściwości $attributes,

public function getStatusAttribute()
{
    $status = $this->attributes['status'] ?? null;

    if ( $status == 0 ) {
        return ['label' => 'closed', 'bs_class' => 'badge badge-secondary'];
    }
    if ( $status == 1 ) {
        return ['label' => 'answered', 'bs_class' => 'badge badge-success'];
    }
    return ['label' => 'waiting', 'bs_class' => 'badge badge-warning'];
}
0
Quynh Xuan Nguyen 28 czerwiec 2021, 11:06

To jest nie dokładne przetestowane rozwiązanie, jest przeznaczone tylko do podania pomysłu, prawdopodobnie będziesz musiał naprawić jakiś błąd, ps : TO NIE JEST DOKŁADNE ROZWIĄZANIE ANI NIE ZOSTAŁO TESTOWANE, więc proszę go nie oceniać

public function getStatusAttribute()
{
    if ( $this->status == 0 ) {
        $status = array('label' => 'closed', 
                        'bs_class' => 'badge badge-secondary'
                        );
        
    }
    else if ( $this->status == 1 ) {
        $status = array('label' => 'answered', 
                        'bs_class' => 'badge badge-success'
                        );
        
    }
    else 
    {
        $status = array( 'label' => 'waiting',
                         'bs_class' => 'badge badge-warning'
                         );
    }

   
    return view('yourViewname', ['status' => $status] );
}

Twoim zdaniem

<td>   
    <span class="{{ $status['bs_class'] }}">
    {{ $status['label'] }}
  </span>
</td>
0
vins 28 czerwiec 2021, 10:47