Как получить данные нескольких столбцов из двух таблиц в одном представлении - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь получить данные из двух таблиц (бренды и raw_materials), связанных внешним ключом (brand_id).Бренд может иметь несколько видов сырья.Я хочу, чтобы все это отображалось под соответствующим брендом на одной странице.Вместо этого я получаю результаты отображаются отдельно.

Использование Laravel 5.7 и Eloquent.

My Tables
[brands]
id    name
----------
1   Apple 
2   Colgate
3   LintX

[raw_materials]
id    name        brand_id      quantity
-----------------------------------------
1    50g pouch        1        200
2    10g laminate     3        320
3    75mm oil         1        500
4    Mint Rubber      3        400
5    Fire pouch       2        550
6    400 String       1        500
7    90g pouch        2        200



PageController

$brandData = DB::table('brands')
            ->join('raw_materials','raw_materials.brand_id','brands.id')
            ->select('brands.id as brand_id','brands.name as brand_name','raw_materials.name as raw_material','raw_materials.quantity')
            ->orderBy('brands.id')
            ->get();<br>
return view('rawmaterials.index', [
            'brandData'=>$brandData,
        ]);



Просмотр

@foreach ($brandData as $brand)
<p>Brand Name: {{$brand->brand_name}}</p>
<p>{{$brand->raw_material}} | Quantity: {{$brand->quantity}}</p>
<br>
@endforeach

Ожидаемые результаты:

Фирменное наименование: Apple
50 г мешочек |Количество: 200
75мм масло |Количество: 500
400 Строка |Количество: 500

Фирменное наименование: Colgate
Мешочек для огня |Количество: 550
75мм масло |Количество: 500
400 Строка |Количество: 500

next brand ..


Фактический результат:

Фирменное наименование: Apple
50 г мешочек |Количество: 200

Фирменное наименование: Apple
75 мм масло |Количество: 500

Фирменное наименование: Apple
400 String |Количество: 500

Фирменное наименование: Colgate
Пожарная сумка |Количество: 550

And so on..

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Это будет работать

$brandData = \DB::table('brands')->orderBy("brands.id")->get();

foreach ($brandData as $brand) {
    $brand->raw_materials = \DB::table("raw_materials")->where("brand_id", $brand->id)->get();
}

return view('rawmaterials.index', [
            'brandData'=>$brandData
        ]);

Тогда, по вашему мнению, вы будете использовать вложенные как это ...

@foreach ($brandData as $brand)
<p>Brand Name: {{$brand->name}}</p>
@foreach($brand->raw_materials as $raw)
<p>{{$raw->name}} | Quantity: {{$raw->quantity}}</p>
@endforeach
<br>
@endforeach

Это должно сделать работу.

С другой стороны, если вы хотите использовать Eloquent, вы должны установить отношения как в модели Brand, так и в модели RawMaterial следующим образом, предполагая, что модели Brand и RawMaterial находятся непосредственно в папке приложения

class Brand extends Model
{
    public function raw_materials()
    {
        return $this->hasMany('App\RawMaterial');
    }
}

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

Тогдав вашем контроллере вы просто делаете это ...

$brandData = \App\Brand::with("raw_materials")->orderBy("id")->get();

Нет необходимости изменять синтаксис блейда в вашем файле .blade, поскольку применяется тот же цикл foreach

0 голосов
/ 20 июня 2019

Сначала вы можете создать отношение:

function raw_materials() {
     return $this->hasMany(RawMaterial.class);
}

В вашем контроллере используйте функцию with () следующим образом:

$brandData = Brand::with('raw_materials')->all();
return view('rawmaterials.index', [
    'brandData'=>$brandData
]);

Затем, по вашему мнению, вы можете получитьданные таблицы raw_materials:

@foreach($branData as $brand)
   <h3>{{ $brand->name }}</h3>
   @foreach($brand->raw_materials as $raw_material)
       <div>{{ $raw_material->name }}</div>
       <div>{{ $raw_material->quantity }}</div>
   @endforeach
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...