Laravel красноречивый несколько таблиц, где критерии - PullRequest
0 голосов
/ 01 июля 2018

Я потратил два дня, пытаясь решить эту проблему, но не повезло. У меня есть 3 таблицы, категории, элементы и связанные элементы, у каждого элемента есть одна категория, и у категории может быть много элементов, эта часть работает нормально, теперь проблема в связанном элементе, у меня в таблице realteditems 3 поля, id (просто автоинкремент), ritemf_id, riteml_id, которые ссылаются на item_id в таблице элементов. То, что я хочу сделать, - это отобразить элемент с его деталями и связанными с ним элементами. Это означает, что если в элементе 1 имеется много реализованных элементов, таких как item2, item3, item4 .., поэтому необходимо отобразить как

item_title: item1

связанный элемент:

item2

item3

item4

контроллер

   $items = Item::orderBy('category_id', 'asc')->with('category')->get()->groupBy('category_id');

   $categories = Category::orderBy('category_id', 'asc')->get();

   return view('home',['items' => $items,'ritems' => $ritems,'categories' => $categories]);

предметы модальные

 public function category() 
  {
    return $this->belongsTo('App\Category', 'category_id');
   }
 public function relateditems() 
 {
 return $this->belongsTo('App\Relateditem', 'ritemf_id');       
  }

модальных связанных элементов:

 class Relateditem extends Model
  {
    protected $table="relateditems";
   protected $fillable=['ritemf_id','riteml_id'];
   protected $primaryKey='id';
   public $timestamps=false;
 public function items() 
 {  
    return $this->belongsTo('App\Item', 'item_id');
 }
 }

показ предметов с категорией в лезвии (работает нормально)

 @if (!empty($categoryItems->first()->category))        
 {{ $categoryItems->first()->category->category_name }} @else {{$category_id}} @endif

   @foreach($categoryItems as $item)
 {{$item->item_title}}
  ${{$item->item_price}}
 @endforeach
 @endforeach

enter image description here

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Необходимо исправить оба отношения в Item Модель и RelatedItem модель. relateditems должен быть hasMany, потому что элемент может иметь много связанных элементов. Вам также необходимо определить belongsTo отношение в RelatedItem к Item, используя riteml_id key

Элемент модальный

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

public function relateditems() 
{
    return $this->hasMany('App\Relateditem', 'ritemf_id');       
}

Модал по теме:

class Relateditem extends Model
 {
    protected $table="relateditems";
    protected $fillable=['ritemf_id','riteml_id'];
    protected $primaryKey='id';
    public $timestamps=false;

    public function item() //i have change it to item instead items, because belongsTo always return single record
    {  
        return $this->belongsTo('App\Item', 'riteml_id');
    }
 }

Выборка данных

$items = Item::orderBy('category_id', 'asc')->with('category','relateditems', 'relateditems.item')->get()->groupBy('category_id');

foreach($items as $categoryId => $groupItems){
   echo $groupItems->first()->category;
   foreach($groupItems as $item) {
       echo $item->item_tile;
       ...
       foreach($item->relateditems as $relatedItem){
           if ($relatedItem->item){
              echo $relatedItem->item->item_tile; //this will show you related item title
           }
       }
    }
}

Для одного товара

   $item = Item::with('category','relateditems', 'relateditems.item')->find(1);

   foreach($item->relateditems as $relatedItem){
       if ($relatedItem->item){
          echo $relatedItem->item->item_tile; //this will show you related item title
       }
   }
0 голосов
/ 01 июля 2018

relateditems() определение выглядит некорректно для меня в модели Item, у элемента может быть несколько связанных элементов, тогда это должна быть hasMany/beongsToMany ассоциация.

Примите его hasMany, затем обновите модель вашего предмета как

public function relateditems()  {
    return $this->hasMany('App\Relateditem', 'ritemf_id');       
}

И с нетерпением жду ваших связанных предметов для каждого элемента

$items = Item::orderBy('category_id', 'asc')
             ->with(['category', 'relateditems'])
             ->get()
             ->groupBy('category_id');

Я предполагаю, что метод groupBy используется из класса сбора для группировки извлеченных данных не на стороне базы данных

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