Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 03.02.2017 18:10:26

Запрос для каталог/товар

День добрый, хочется сделать каталог по такой схеме:

groups
таблица группа:
id
title

items
таблица товар
id
title
price
description

options
таблица параметры товара
id
title
value

items_options
таблица совмещения товара и параметров (у товара может быть несколько характеристик)
option_id
item_id

items_groups
таблица совмещения товара и группы (товар может принадлежать нескольким группам)
group_id
item_id

но вот как всё совместить? как будут выглядеть модели для этих таблиц?

например чтобы вывести все товары по id группы со всеми характеристиками?
ка вывести товар по id со всеми характеристиками?

как сохранить (при добавлении товара) в бд с характеристиками?

Изменено Сергей (03.02.2017 18:12:19)

Не в сети

#2 04.02.2017 00:01:36

Re: Запрос для каталог/товар

каждая таблица это отдельная сущность (модель) в них ты связываешь все что тебе необходимо,
я бы value в таблице options перенес в items_options и добавил поле еще туда сортировка, вдруг захочется поменять местами характеристики, если будет какая-то конкретная сложность задавай, так у тебя вроде все просто wink

Не в сети

#3 04.02.2017 13:07:44

Re: Запрос для каталог/товар

Сделал так:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Group extends Model
{

    protected $table = 'groups';
    public $timestamps = false;

    protected $fillable = ['title'];

    public function items()
    {
        return $this->belongsToMany('App\Item', 'items_groups');
    }

}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{

    protected $table = 'items';
    public $timestamps = false;

    protected $fillable = ['title', 'price', 'description'];

    public function options()
    {
        return $this->belongsToMany('App\Option', 'items_options');
    }

}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Option extends Model
{

    protected $table = 'options';
    public $timestamps = false;

    protected $fillable = ['sort', 'title', 'value'];

}

2cccc8e802b54b48a5309cda957ac524.png

Пытаюсь вывести но ошибка Call to a member function items() on null

$group = Group::find(1)->items();

Не в сети

#4 04.02.2017 13:20:35

Re: Запрос для каталог/товар

ошибся вот так:

c4723ccebbac49bf98247f8eea79b53b.png

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Option extends Model
{

    protected $table = 'options';
    public $timestamps = false;

    protected $fillable = ['title'];

}

Изменено Сергей (04.02.2017 13:21:18)

Не в сети

#5 04.02.2017 13:58:10

Re: Запрос для каталог/товар

Вот так работает: но options не выводятся

    public function index()
    {
        $group = Group::find(1);
        echo $group->items;
    }

Не в сети

#6 04.02.2017 15:01:01

Re: Запрос для каталог/товар

а у вас опции должны идти вместе с группами ? или в определенном товаре?

Не в сети

#7 04.02.2017 15:07:37

Re: Запрос для каталог/товар

Alukard19918 пишет:

а у вас опции должны идти вместе с группами ? или в определенном товаре?

в товаре, но я вывожу все товары из группы почему бы не вывести их характеристики

Не в сети

#8 05.02.2017 12:33:38

Re: Запрос для каталог/товар

$group = Group::find(1);
        echo $group->items->with('options');


почему with не присоединяется?
BadMethodCallException

Изменено Сергей (05.02.2017 12:34:05)

Не в сети

#9 05.02.2017 14:31:20

Re: Запрос для каталог/товар

$group = Group::find(1);
$group->items->load('options');
var_dump($group->items);

или в модели Item указать что связь options всегда должна загружаться

Не в сети

#10 05.02.2017 21:29:52

Re: Запрос для каталог/товар

спасибо

Не в сети

#11 18.04.2017 02:05:28

Re: Запрос для каталог/товар

Подскажите как сделать поиск по значению в опциях

вот так не получается:

$group_main = Group::find($id);

        return $group_main
                ->options()
                ->wherePivot('options.value', 'тест')
                ->wherePivot('options.option_id', 10)
                ->where('price', '>' , $min)
                ->where('price', '<' , $max)
                ->paginate(15);

Не в сети

#12 19.04.2017 15:38:26

Re: Запрос для каталог/товар

Вылезает ошибка

Unknown column 'items_groups.items_options.option_id'....

всё правильно в таблице items_groups нет items_options.option_id

как именно в items_options сделать 'where '

Не в сети

#13 19.04.2017 15:53:12

Re: Запрос для каталог/товар

если поиск осуществлять в options то выводятся теже товары только с массивом options где присутствует в value 23

    public function options()
    {
        return $this->belongsToMany('App\Option', 'items_options')->where('value', '23')->withPivot('sort', 'value');
    }

Не в сети

Подвал раздела