I have simple implementation of oneToMany, Category -> Features, but cannot access features from blade template.
Controller:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreVenueRequest;
use Illuminate\Http\Request;
use App\Models\Feature;
use App\Models\Category;
use App\Models\City;
use App\Models\Venue;
class VenueController extends Controller
{
public function create(Category $category)
{
$categories = Category::all();
$cities = City::all();
// dd($category->features);
return view('frontend.venues.create', [
'category' => $category,
'categories' => $categories,
'cities' => $cities,
]);
}
}
Template (create.blade.php):
<div >
{{ dd($category->features) }}
<ul>
@foreach ($category->features as $feature)
<li>
<input id="{{ $feature->code }}" value="{{ $feature->id }}" type="checkbox" name="features_bool[]">
<label for="{{ $feature->code }}">{{ $feature->name_bg }}</label>
</li>
@endforeach
</ul>
</div>
Category Model:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
public function venues()
{
return $this->hasMany(Venue::class);
}
public function features()
{
return $this->hasMany(Feature::class);
}
}
Feature Model:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Feature extends Model
{
use HasFactory;
public function category()
{
return $this->belongsTo(Category::class);
}
}
Commented row in the controller dd($category->features); returns:
Illuminate\Database\Eloquent\Collection {#1411 ▼
#items: array:8 [▼
0 => App\Models\Feature {#1434 ▶}
1 => App\Models\Feature {#1429 ▶}
2 => App\Models\Feature {#1452 ▶}
3 => App\Models\Feature {#1407 ▶}
4 => App\Models\Feature {#1456 ▶}
5 => App\Models\Feature {#1458 ▶}
6 => App\Models\Feature {#1439 ▶}
7 => App\Models\Feature {#1254 ▶}
]
#escapeWhenCastingToString: false
}
Same row in the blade file {{ dd($category->features) }} returns empty array:
Illuminate\Database\Eloquent\Collection {#1447 ▼
#items: []
#escapeWhenCastingToString: false
}
I checked most of the questions with simmiliar problems, but without any success. I have needed relationships hasMany and belongsTo
CodePudding user response:
Well, my guess is when you try to load features server-side, Laravel can lazy query your relation and include it to your model, but if you do the same directly on blade, it's too late so your collection remains empty.
If you need to load your relation punctually, you can get a fresh instance of your model and load relations:
public function create(Category $category)
{
$categories = Category::all();
$cities = City::all();
// dd($category->features);
return view('frontend.venues.create', [
'category' => $category->fresh(['features']),
'categories' => $categories,
'cities' => $cities,
]);
}
but if you need thoses relations every time the model is loaded, then you can overwrite the property $with in your model class:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
/**
* The relations to eager load on every query.
*
* @var array
*/
protected $with = ['features'];
public function venues()
{
return $this->hasMany(Venue::class);
}
public function features()
{
return $this->hasMany(Feature::class);
}
}
CodePudding user response:
Have you tried to return with $id? You said in the comment that there is a problem with the id.
Maybe in your controller try something like this:
public function create($id)
{
$category = Category::find($id);
return view('frontend.venue.create',compact('project'));
}
