Красноречивая проблема в шаблоне лезвия - PullRequest
1 голос
/ 23 сентября 2019

У меня есть функция в моем контроллере, как показано ниже

 public function singleCategory($id){
    if($id == 'all') {
        $category = Category::get();
    } else {
        $category = Category::find($id);
    }
    return view('campaigns_by_category', compact('category'));
}

В шаблоне блейда я использую код ниже

 @if(request()->segment(2) == 'all')
                @php
                    foreach($category as $cat) {
                        $campaigns = $cat->users()->orderBy('id', 'desc')->paginate(20);
                    }
                @endphp
            @else
                @php
                    $campaigns = $category->users()->orderBy('id', 'desc')->paginate(20); 
                @endphp
            @endif
            {{ count($campaigns) }}  // why I am getting 0 here ?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Потому что когда вы ->get() или ->all() $category становитесь коллекцией из Category, а не Category

@if(request()->segment(2) == 'all')
   @php
        foreach($category as $cat) {
          $campaigns = $cat->users()->orderBy('id', 'desc')->paginate(20);
        }
    @endphp
@else
    @php
          $campaigns = $category->users()->orderBy('id', 'desc')->paginate(20); 
    @endphp
@endif 

@if($campaigns->count() > 0)
    // some code here
@endif

Edit;

Как вы и спросили Но почему я получаю 0 в качестве результата ниже? Часть ниже перезапишет $campaigns, так как вы находитесь в foreach

foreach($category as $cat) {
    $campaigns = $cat->users()->orderBy('id', 'desc')->paginate(20);
}

Можетa предложить вам что-то другое


 public function singleCategory($id){

    // Eager loading the users before will increase the performance, by performing one single query instead of repeting the query in a loop
    $query = Category::with(['users' => function($query) {
        $query->orderBy('id', 'desc')->paginate(20);
    }])


    if($id == 'all') {
        $categories = $query->get();
    } else {
        // findOrFail() will throw a 404 when the ID doesn't not exists
        // [$id] is an array to return a Collection of Category
        $categories = $query->findOrFail([$id]);
    }
    return view('campaigns_by_category', compact('categories'));
}

Тогда в вашем клинке вам не нужно знать, есть ли у вас одна или несколько категорий.

@foreach($categories as $category)

 {{-- "In my knowledge we can't alias with eager loading, but you can still make a relationshion campaigns instead of users" --}}
    {{ $category->users->count() }}

    {{-- "forelse is like a foreach but perform a `else` when users are empty" --}}
    @forelse($category->users as $campaign)
        {{ $campaign }}
    @empty
        No campaigns for {{ $category }}
    @endforelse

@foreach
1 голос
/ 23 сентября 2019

Отношения Laravel работают следующим образом: Определите отношение между категорией и пользователем в Category Модальное.

class Category extends Model
{
   function users() {
      return $this->hasMany('App\User');
   }
}

Надеюсь, вы поймете.Если нет, то прочитайте красноречивые отношения laravel https://laravel.com/docs/6.x/eloquent-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...