Laravel, простой и правильный путь для отношений - PullRequest
0 голосов
/ 08 января 2019

Я хочу перечислить связанные категории связанной марки с этой логикой.

Таблица продуктов

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('slug');
        $table->integer('brand_id')->unsigned();
        $table->foreign('brand_id')->references('id')->on('brands')->onDelete('cascade');
        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
        $table->timestamps();
    });
}

web.php

Route::get('{Brand}/{Category}/{Product}', 'ProductsController@show');
Route::get('{Brand}/{Category}', 'ProductsController@index');

1-й маршрут, например; Samsung / Телефоны должны перечислить все телефоны Samsung со следующей частью кода. Есть ли другой способ сделать эти коды простыми? И этот запрос возвращает ноль. Я проверил, что запрос получает правильные столбцы, но возвращает ноль.

use App\Product;
use App\Brand;
use App\Category;

class ProductsController extends Controller
{
    public function index(Request $request)
    {   
        $category = $request->Category;
        $cat_id = Category::select('id')
                    ->where('slug',$category)
                    ->get();

        $brand = $request->Brand;
        $br_id = Brand::select('id')
                ->where('slug', $brand)
                ->get();

        $products = Product::select('id','name','slug')
                ->where('category_id', $cat_id)
                ->where('brand_id', $br_id)
                ->get();

        return view('products.index', compact('products'));
    }
}

product.php

class Product extends Model
    {
        public function brands()
        {
            return $this->belongsTo('App\Brand');
        }

        public function categories()
        {
            return $this->belongsTo('App\Category');
        }
    }

category.php

class Category extends Model
{

    public function brands()
    {
        return $this->belongsToMany('App\Brand');
    }

    public function products()
    {
        return $this->hasMany('App\Product');
    }
}

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Я думаю, что вы наконец-то используете метод get, который даст вам массив не только одного значения. Не могли бы вы попробовать с приведенным ниже кодом. Это может помочь

use App\Product;
use App\Brand;
use App\Category;

class ProductsController extends Controller
{
public function index(Request $request)
{   
    $category = $request->Category;
    $cat_id = Category::where('slug',$category)->value('id);

    $brand = $request->Brand;
    $br_id = Brand::where('slug', $brand)->value('id);

    $products = Product::select('id','name','slug')
            ->where('category_id', $cat_id)
            ->where('brand_id', $br_id)
            ->get();

    return view('products.index', compact('products'));
}
}
0 голосов
/ 08 января 2019

Вы должны попробовать это:

public function index($brand, $category,Request $request)
    {   

        $products = Product::select('id','name','slug')
                ->where('category_id', $category)
                ->where('brand_id', $brand)
                ->get();

        return view('products.index', compact('products'));
    }
0 голосов
/ 08 января 2019

Прежде всего, прочитайте документы о взаимоотношениях Laravel: https://laravel.com/docs/5.7/eloquent-relationships

Причина, по которой ваш текущий код не работает, заключается в том, что в вашем маршруте вы запрашиваете параметры:

Route::get('{Brand}/{Category}', 'ProductsController@index');

Но в вашем методе index () вашего ProductsController вы не включили эти параметры.

 public function index(Request $request, Brand $brand, Category $category)

Вторая проблема в вашем коде заключается в том, что вы вообще не используете свои отношения. Ваш текущий контроллер только что сделал новый красноречивый запрос.

Пример получения всех продуктов для данной категории, используя метод, который вы определили в вашей модели категории:

public function index(Request $request, Brand $brand, Category $category)
{   

    $products = $category->products;

    return view('products.index', compact('products'));
}

Пример расширения с указанным брендом:

public function index(Request $request, Brand $brand, Category $category)
{   

    $products = $category->products()->where('brand_id', $brand->id)->get();

    return view('products.index', compact('products'));
}

UPDATE

Как отмечается в комментариях, параметры URL являются слагаемыми, а не идентификаторами, поэтому автоматическое связывание модели маршрута не будет работать. Обновленное решение со слизнями:

public function index(Request $request, $brand, $category)
{
    $categoryModel = Category::where('slug', $category)->firstOrFail();
    $brandModel = Brand::where('slug', $brand)->firstOrFail();   

    $products = $categoryModel->products()->where('brand_id', $brandModel->id)->get();

    return view('products.index', compact('products'));
}

Дальнейшее улучшение вашего кода будет состоять в том, чтобы добавить область или вспомогательный метод, чтобы вы могли сделать что-то вроде Brand::FindBySlug($slug);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...