Как динамически переключаться между двумя массивами для атрибута в моем шаблоне лезвия - PullRequest
1 голос
/ 06 августа 2020

У меня есть метод контроллера, который извлекает данные из очереди, очередь может иметь отношение либо к модели гостя, либо к модели клиента.

В моем шаблоне лезвия я перебираю очередь, и мне нужно отобразить либо Guest.Name или Customer.Name в зависимости от того, какой столбец заполнен.

Controller

$queue = Queue::where('business_id', '=', $business_id);

$customer_bag = $queue->pluck('user_id');
$guest_bag = $queue->pluck('guest_id');

$customers = User::whereIn('id', $customer_bag)->get();
$guests = Guest::whereIn('id', $guest_bag)->get();

return view('myqueue', compact(['queue', 'customers', 'guests']));

Blade Template

@foreach($queue as $quee)
    {{ $customers->find($quee->user_id) ? $customers->find($quee->user_id)->name : $guests->find($quee->guest_id)->name }}
@endforeach

Когда я использую это, а guest_id пустой, я получаю сообщение об ошибке «Попытка получить имя свойства не-объекта». Как правильно определить, какой из них использовать?

Ответы [ 2 ]

0 голосов
/ 09 августа 2020

Проблема оказалась в том, что одна из моих записей тестовых данных не имела значения в guest_id, когда должно было быть, это привело к сбою рендеринга шаблона лезвия.

0 голосов
/ 06 августа 2020

Я думаю, что с вашим кодом столько проблем.

Во-первых, $queue - это findOrFail(), который возвращает данные одного объекта (не массив или коллекцию, которые можно использовать для foreach.) Я думаю, вам нужно изменить на get()

Также $customers и $guests являются коллекцией, поэтому вы не можете использовать метод find().

Тогда вы не определили $quee в @foreach, поэтому он даст результат ошибки.

Я думаю, что этот код вернется, как вы ожидали, если вы исправите указанные выше проблемы:

@foreach($queue as $quee)
    {{ \App\Customer::find($quee->user_id)->name ?? \App\Guest::find($quee->guest_id)->name ?? "no name" }}
@endforeach

Но лучший подход - использовать отношение из вашего модель очереди:

public function customer()
{
    return $this->belongsTo(Customer::class);
}

public function guest()
{
    return $this->belongsTo(Guest::class);
}

public function getNameAttribute()
{
   return $this->customer?$this->customer->name:($this->guest->name??"no name");
}

и в виде лезвия

@foreach($queue as $quee)
    {{ $quee->name }}
@endforeach
...