Отношение доступа сводной таблицы в Laravel - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть три модели Bill, Product и Process. Bill имеет отношение ManyToMany с Product, а в сводной таблице есть несколько дополнительных полей. Я пишу Bill класс модели, как следует:

<?php
    class Bill extends Model
    {
           function products(){
                return $this->belongsToMany(\App\Product::class)
                    ->withPivot('process_id') // the id of the Process 
                    ->withTimestamps();
            }
    }

Модель Process представляет собой простую таблицу с id и name. Я связываю идентификатор в сводной таблице для ссылки на процесс, имя может меняться со временем, но все еще ссылается на ту же концепцию, поэтому я не могу связать имя.

На странице показа для одного Bill перечислены продукты, связанные в таблице, например:

@foreach($bill->products as $product)
     <tr>
        <td>{{$product->barcode}}</td>
        <td>{{$product->pivot->process_id}}</td> 
     </tr>
@endforeach

Так что проблема в том, что мне нужно имя процесса, но у меня есть идентификатор. Я не уверен, как я мог получить имя.

Спасибо

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Я знаю, что это не самое элегантное решение.но вы всегда можете просто сделать:

Process::find($product->pivot->process_id)->name;

Я бы не советовал, хотя, поскольку вы уже просматриваете массив, поэтому издержки на выполнение чего-либо подобного будут довольно большими.

Другим решением было бы создание класса Pivot с именем say BillProductPivot, который имел бы отношение, чтобы возвращать как Product, так и Process, тогда, когда вы вызываете их, вы должны использовать готовую загрузку, чтобы получить отношения.Конечный продукт может выглядеть так:

$bill->load('productPivots', 'productPivot.process', 'productPivot.product');

@foreach($bill->productPivots as $productPivot)
 <tr>
    <td>{{$productPivot->product->barcode}}</td>
    <td>{{$productPivot->process->name}}</td> 
 </tr>
@endforeach
0 голосов
/ 14 сентября 2018

Я думаю, что вы можете использовать собственную модель Pivot, например, ProductBill для достижения этой цели.

class ProductBill extends Pivot {

    public function process() {
        return $this->belongsTo(Process::class);
    }

}

По с использованием этой модели в вашем products отношении Bill

class Bill extends Model {

    function products() {
        return $this->belongsToMany(\App\Product::class)
            ->withPivot('process_id')
            ->using(ProductBill::class)
            ->withTimestamps();
    }

}

При доступе к $product->pivot вы должны получить экземпляр MyCustomPivotModel сейчас, следовательно, вы должны быть в состоянии сделать следующее:

<td>{{$product->pivot->process->name}}</td> 

(К сожалению, сейчас я не могу перепроверить: /)

0 голосов
/ 14 сентября 2018

Не имея прямого отношения к Process, вам, вероятно, потребуется добавить помощника на вашу модель Product, чтобы получить имя Process.

В вашей модели продукта:

public function processName($processId) {
    return Process::where('id', $processId)->pluck('name')->first();
}

По вашему мнению:

<td>{{$product->processName($product->pivot->process_id) }}</td> 

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

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