Как объединить поля в таблице?

Версия laravel 5.0.34
Хочу вывести все товары , которые относятся к категориям.
Подскажите плиз почему при вызове

$comments = \App\category::find(1)->products()->all();

Возвращается ошибка "Call to a member function products() on a non-object"

Сделал связь один ко многим.

Модель с таблицей продуктов:
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class product extends Model  {
	protected $table = 'products';
	public function category()
	{
		return $this->belongsTo('App\category','id', 'category_id');
	}

 
}


Модель с таблицей категорий:
<?php namespace App;


use Illuminate\Database\Eloquent\Model;


class category extends Model  {
	protected $table = 'categories';



	public function products()
	{
		return  $this->hasMany('App\product' ,'category_id', 'id');
	}


}


вызываю эту связь из метода контроллера:
<?php namespace App\Http\Controllers;


use App\category;
use App\product;
....
 public function categoryItem(category $categoryModel,product $productModel ) {
        $comments = \App\category::find(1)->products()->all();
    }


таблицы:

CREATE TABLE `products` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`title` VARCHAR(255) NOT NULL DEFAULT '0',
	`img` VARCHAR(255) NOT NULL DEFAULT '0',
	`intro_text` VARCHAR(255) NOT NULL DEFAULT '0',
	`status` INT(1) NOT NULL DEFAULT '0',
	`full_text` TEXT NOT NULL,
	`slug` VARCHAR(50) NOT NULL,
	`price` INT(11) NOT NULL,
	`category_id` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=6
;


CREATE TABLE `categories` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`title` VARCHAR(255) NOT NULL,
	`full_text` TEXT NOT NULL,
	`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
	`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
	`slug` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=7
;
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Vladnev
Проверьте, для начала, есть ли у вас категория с таким id.
Второй момент all() вам уже не нужен так как запрос выполняет find().

И лучше такой запрос организовать немного по другому:
category::with('products')->find($id);
И еще одно исправление:
<?php namespace App\Http\Controllers;


use App\category;
use App\product;

public function categoryItem(category $categoryModel,product $productModel ) {
    $comments = category::with('products')->find($id);

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы