TalESid
TalESid

Reputation: 2514

Laravel get and paginate same data

I am using Laravel for controller and blade file for a webpage. My code is something like:

PropertiesController

$properties = Property::where('status', 1);
$properties = $properties->orderBy('properties.created_at', 'DESC')->paginate(8);
return view('properties.index')->with('properties', $properties);

in index.blade.php

@foreach ($properties as $property)
<div class="geo">
  <span class="lat">{{ $property->title }}</span>,
  <span class="lng">{{ $property->description }}</span>
</div>

what I want to achieve is to get categories w.r.t. counts along with properties, for that, I am doing

$properties = Property::where('status', 1);

$categories = array();
if (is_null($req->c)) {
    $search = $properties;
    foreach (Category::all() as $category) {
     array_push(
       $categories,
          array(
            'id' => $category->id,
            'name' => $category->category,
            'counts' => count($search->where('properties.category', $category->id)->get()),
          )
       );
    }
}

$properties = $properties->orderBy('properties.created_at', 'DESC')->paginate(8);

return view('properties.index')->with('properties', $properties)->with('categories', $categories);

$search = $properties; and
'counts' => count($search->where('properties.category', $category->id)->get()),

with this it gives me error

Trying to get property of non-object
<span class="lat"><?php echo e($property->title); ?></span>,

Upvotes: 1

Views: 1699

Answers (2)

user9624510
user9624510

Reputation:

What I think is you want to pass your data to blade view and get counts of categorized data with each category... For that, you can use duplicated functions to count your data separately. e.g.:

public function properties() {
    $properties = Property::where('status', 1);

    $categories = array();
    foreach (Category::all() as $category) {
        $count = $this->count($category->id);
        array_push(
            $categories,
            array(
                'id' => $category->id,
                'name' => $category->category,
                'counts' => $count,
            )
        );
    }

    $properties = $properties->orderBy('properties.created_at', 'DESC')->paginate(8);

    return view('properties.index')->with('properties', $properties)->with('categories', $categories);
}


public function count($id) {
    $count = count(Property::where('category_id', $id)); // or any variable you are using to connect categories table with
    return $count;
}

$count = $this->count($category->id);

This is the line which did the trick.

Upvotes: 2

Pedro Gomez
Pedro Gomez

Reputation: 1

If the relationships are made in the models you should only use with () in this way. This is how the controller should be.

$properties = Property::where('status', 1)->with('category')->orderBy('properties.created_at', 'DESC')->paginate(8);
return view('properties.index', compact('propierties'));

This will give you the list of Properties next to the assigned category.

But if you need to list the categories and have in each category the properties you must do this.

$categories = Category::with('properties')->paginate(8);
return view('properties.index', compact('categories'));

Upvotes: 0

Related Questions