Почему я получаю «Нестатический метод App \ Models \ Category :: products () не должен вызываться статически» в laravel - PullRequest
0 голосов
/ 02 ноября 2018

Модель Category.php

public function products() {
    return $this->belongsToMany('App\Models\Product', 'category_product', 'category_id', 'product_id')->withTimestamps();
}

Модель Product.php

public function categories() {
    return $this->belongsToMany('App\Models\Category', 'category_product', 'product_id', 'category_id')->withTimestamps();
}

HomeController.php

$category = Category::products()->find($id);
return view('site.category.details',[
    'details' => $category
]);

details.blade.php

@dd($details->pivot->name)

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Если вы хотите загрузить «товары» по категориям, вы можете сделать это следующим образом:

$category = Category::with('products')->find($id);

Или другим способом:

$category = Category::find($id)->load('products');

Вы можете увидеть различия между двумя методами в здесь и здесь .

0 голосов
/ 02 ноября 2018

Предупреждение связано с тем, что $this недоступен при статическом вызове метода, и если метод не объявлен как статический, вполне возможно, что кто-то может добавить к этому методу оператор $this, не ожидая, что он будет вызываться статически.

0 голосов
/ 02 ноября 2018

Когда вы определяете отношение belongsToMany, которое определяет отношение для данной Категории. Но, позвонив по номеру Category::products()..., вы еще не сказали, для какой категории вы хотите получить продукты.

Там вы можете сделать $category = Category::find($category_id), чтобы получить категорию, а затем получить продукты для этой категории, выполнив $category->products. Конечно, вы можете перейти непосредственно к таким продуктам: Category::find($category_id)->products.

Если вы позвоните ->products, вы получите результат сбора продуктов. Если вы вызываете его с круглыми скобками ->products(), вы получаете обратно класс запросов БД, который затем позволяет вам добавить дополнительные методы запроса, такие как: ->products()->where('id', $product_id)->get().

Так что я думаю, что вы могли просто поставить ->find($id) после ->products() вместо ранее.

...