chelkaz
@chelkaz

Использовать ли Blade такую конструкцию?

Все советуют использовать Blade по максимуму. Вот есть условие у меня, использовать его так или все таки нативным способом через <?php ?>. Краткую запись if не нужно предлагать, так как код с присваиванием переменной длинный, например:
$UserPhoto = '/images/user_profile/'.\App\Models\Question::find($quest_id)->user->UserPhoto->image_url.'.jpg';

Вот как сейчас через Blade:
@if( $a == $b )
{{-- */ $a = 1 /* --}}
@else
{{-- */ $a = 0 /* --}}
@endif
  • Вопрос задан
  • 278 просмотров
Решения вопроса 1
chelkaz
@chelkaz Автор вопроса
Не знаю что решение логичнее, но я сделал следующее:
Для того что бы избежать постоянное обращение к базе за информацией о пользователе и к таблице за фото, я воспользовался:
$AllQuestions = Question::with('user', 'file')->get();

В итоге в $AllQuestions формируется массив из 3-х таблиц.
В модели Question
Сделал следующее:
class Question extends Model
{
    //
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function file(){
        return $this->hasOne('App\Models\File','user_id','user_id')->where('module_id', 'user_profile');
    }
}

И я явно указал для таблицы files поля для связи!
'user_id','user_id'
Иначе по умолчанию связи не будет!
После чего в представление можем передать рабочий массив:
return view('questions.index', compact('AllQuestions'));
Запросы уменьшились до 6 вместо почти 70 если например 20 юзеров.
На мысль навела доку. Eager Loading Multiple Relationships
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
seoperin
@seoperin
Full stack web developer. Laravel / Vue
{{ $user->photo or 'дефолтное фото' }}
Ответ написан
Комментировать
Suinly
@Suinly
В файлах blade только конструкции blade. Большую часть логики, тем более присваивания каких-либо значений переменным, все же рекомендуется выполнять до рендеринга представления (View) и вне его, что бы не усложнять.

По сути, просто готовите нужные переменные в контроллере, передаете в представление:

$a = ($a == $b) ? 1 : 0;
return render('someview')->with(['a' => $a]);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы