如何根据 Laravel 中的 ID 匹配从 3 个不同的表中获得最佳结果。
How to best get results from 3 different tables based on ID matches in Laravel.
正在尝试获取特定供应商的产品和变体。
我可以很容易地获得产品,但无法弄清楚如何最好地获得匹配 product_id 的变体并将其发送到视图。
Variants.product_id 匹配 Product.ID
这有效(为供应商获取产品)
public function suppliers($id) {
$supplier = Supplier::orderby('company_name', 'ASC')->find($id);
$products = Supplier::find($id)->products;
$data = [];
$data['supplier'] = $supplier;
$data['products'] = $products;
return view('admin.purchasing.supplier-details', $data);
}
我已经试过这个来获得变体,但没有成功。
控制器:
public function suppliers($id) {
$supplier = Supplier::orderby('company_name', 'ASC')->find($id);
$products = Supplier::find($id)->products;
$variants = array();
foreach ($products as $product) {
$product_id = $product->id;
$variants[] = Variant::find($product_id);
}
$data = [];
$data['supplier'] = $supplier;
$data['products'] = $products;
$data['variants'] = $variants;
return view('admin.purchasing.supplier-details', $data);
}
查看:
@foreach($products as $product)
<tr>
<td>{{ $product['title'] }}</td>
@foreach($variants as $variant)
@if($variant->product_id == $product['id'])
<td>${{ $variant->price }}</td>
@else
<td>not set</td>
@endif
@endforeach
</tr>
@endforeach
非常感谢任何提示。
首先,你应该在你的模型上设置关系才能完成这项工作
像这样例如:
Supplier.php
public function products()
{
return $this->hasMany('App\Product');
}
Product.php
public function variants()
{
return $this->hasMany('App\Variant');
}
public function Supplier()
{
return $this->belongsToMany('App\Supplier'); //in case you have only one supplier for each product change this to belongsto
}
Variant.php
public function products()
{
return $this->belongsToMany('App\Product'); //not sure if this should be manytomany or one to many , it deppends on what you did
}
无论如何现在你可以做到这一点
控制器
public function suppliers($id) {
$Data = Supplier::where('id',$id)->orderby('company_name', 'ASC')->with('products.variants')->first(); //you will get the supplier with all products associated to him with variants foreach product
return view('admin.purchasing.supplier-details')->with('Data',$Data); // now you just loop the $supplierwithproducts->products to get results (dd the variable to check output)
}
查看
{{ $Data->name }} // supplier name since Supplier model was the starting point
@foreach($Data->products as $product) //loop all products related to that supplier
{{ $product->name }} //shows product name (depends on you database columns
@foreach($product->variants as $variant) // loops all variants in the current product
{{ $variant->name }} // shows variants
@endforeach
@endforeach
如果您复制并粘贴此代码,它可能无法正常工作,但这会让您了解应该如何处理 laravel 中的关系(levrage eloquent 关系)
查看此以获取更多信息
正在尝试获取特定供应商的产品和变体。 我可以很容易地获得产品,但无法弄清楚如何最好地获得匹配 product_id 的变体并将其发送到视图。 Variants.product_id 匹配 Product.ID
这有效(为供应商获取产品)
public function suppliers($id) {
$supplier = Supplier::orderby('company_name', 'ASC')->find($id);
$products = Supplier::find($id)->products;
$data = [];
$data['supplier'] = $supplier;
$data['products'] = $products;
return view('admin.purchasing.supplier-details', $data);
}
我已经试过这个来获得变体,但没有成功。
控制器:
public function suppliers($id) {
$supplier = Supplier::orderby('company_name', 'ASC')->find($id);
$products = Supplier::find($id)->products;
$variants = array();
foreach ($products as $product) {
$product_id = $product->id;
$variants[] = Variant::find($product_id);
}
$data = [];
$data['supplier'] = $supplier;
$data['products'] = $products;
$data['variants'] = $variants;
return view('admin.purchasing.supplier-details', $data);
}
查看:
@foreach($products as $product)
<tr>
<td>{{ $product['title'] }}</td>
@foreach($variants as $variant)
@if($variant->product_id == $product['id'])
<td>${{ $variant->price }}</td>
@else
<td>not set</td>
@endif
@endforeach
</tr>
@endforeach
非常感谢任何提示。
首先,你应该在你的模型上设置关系才能完成这项工作
像这样例如:
Supplier.php
public function products()
{
return $this->hasMany('App\Product');
}
Product.php
public function variants()
{
return $this->hasMany('App\Variant');
}
public function Supplier()
{
return $this->belongsToMany('App\Supplier'); //in case you have only one supplier for each product change this to belongsto
}
Variant.php
public function products()
{
return $this->belongsToMany('App\Product'); //not sure if this should be manytomany or one to many , it deppends on what you did
}
无论如何现在你可以做到这一点
控制器
public function suppliers($id) {
$Data = Supplier::where('id',$id)->orderby('company_name', 'ASC')->with('products.variants')->first(); //you will get the supplier with all products associated to him with variants foreach product
return view('admin.purchasing.supplier-details')->with('Data',$Data); // now you just loop the $supplierwithproducts->products to get results (dd the variable to check output)
}
查看
{{ $Data->name }} // supplier name since Supplier model was the starting point
@foreach($Data->products as $product) //loop all products related to that supplier
{{ $product->name }} //shows product name (depends on you database columns
@foreach($product->variants as $variant) // loops all variants in the current product
{{ $variant->name }} // shows variants
@endforeach
@endforeach
如果您复制并粘贴此代码,它可能无法正常工作,但这会让您了解应该如何处理 laravel 中的关系(levrage eloquent 关系)
查看此以获取更多信息