What am I trying?
Get a particular category and it's associated Sub Categories
Category Model
class Category_Model extends Model
{
protected $table = "tblcategory";
protected $primaryKey = "CategoryID";
public $timestamps = false;
public function Subcategories()
{
return $this->hasMany('\App\Models\Skill\SubCategory_Model');
}
}
Sub Category Model
class SubCategory_Model extends Model
{
protected $table = "tblsubcategory";
protected $primaryKey = "SubCategoryID";
public $timestamps = false;
}
Action Method
public function SubCategories($category)
{
$Categories = \App\Models\Skill\Category_Model
::where("Category", "=", $category)
->Subcategories;
dd($Categories);
}
When I run the code. I get below error
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tblsubcategory.category__model_id' in 'where clause' (SQL: select * from
tblsubcategory
wheretblsubcategory
.category__model_id
= 1 andtblsubcategory
.category__model_id
is not null)
From the comments, it is most likely that your subcategory
table doesn't have a category_model_id
but likely a category_id
. By default, Laravel tries to extrapolate the name of the foreign column from the model name (in this case Category_Model
, which explains the category_model_id
. Changing the class to:
class Category_Model extends Model
{
protected $table = "tblcategory";
protected $primaryKey = "CategoryID";
public $timestamps = false;
public function Subcategories()
{
return $this->hasMany('\App\Models\Skill\SubCategory_Model', 'category_id')->get(); // Or whatever the column is actually called
}
}
should solve the issue.
To return both the category
object and its subcategories
, change the action code to:
public function SubCategories($category)
{
$Categories = \App\Models\Skill\Category_Model
::where("Category", "=", $category)
->with("Subcategories")
->first();
dd($Categories);
}
The $Categories
should also now contain a Subcategories
object, accessed via $Categories->Subcategories
, which should return a collection of Subcategory
objects. If you wanted to see each one, you would loop through with a foreach
foreach($Categories->Subcategories AS $Subcategory){
echo $Subcategory->name;
// etc etc.
}