Hello everyone.
i have a situation where i want to nest the records fetched by eloquent relationship from model itself.
Tables are :
1) Countries
2) States
3) Cities
requirement is that when fetching data via model, countires > states > cities is required in nested array. but currently i am only able to get countries > states with hasMany relationship.
models code is as followed:
//Countries.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Countries extends Model
{
use SoftDeletes;
public function states()
{
return $this->hasMany(States::class, 'country_id', 'id')->where('status', 1);
}
// public function cities()
// {
// return $this->hasManyThrough(Cities::class, States::class, 'country_id', 'state_id', 'id', 'id');
// }
}
//States.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class States extends Model
{
use SoftDeletes;
public function cities()
{
return $this->hasMany(Cities::class, 'state_id', 'id');
}
public function country()
{
return $this->belongsTo(Countries::class, 'country_id', 'id');
}
}
//States.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Cities extends Model
{
use SoftDeletes;
public function state()
{
return $this->belongsTo(States::Class, 'state_id', 'id');
}
public function country()
{
return $this->belongsTo(Countries::Class, 'country_id', 'id');
}
}
Countries controller function :
public function index(Request $request)
{
if($request->isMethod('get') && isset($_GET['cid']) ) {
$records = Countries::where('id', $_GET['cid'])->get();
} else {
$records = Countries::get();
}
$records->map(function ($data) {
return $data->states;
});
// $records->map(function ($data) {
// return $data->states->cities;
// });
$data = $records;
// return print_r($data);
return Response()
->json([
'collection' => $data
]);
return view('pages.countries.index', ['records' => $records]);
}