如何在Laravel的一个表中联接外键不是唯一的表

时间:2019-02-18 08:27:16

标签: mysql arrays json laravel eloquent

我有2个表(产品和位置),我需要从中获得所有产品的位置以及可以一次获得产品的位置。 产品表如下所示:

Product| Price | Product_id
  Rice | 45.00 | 101
  Beans| 30.00 | 102

“位置”表如下:

Product_id | location
101        | Chicago
101        | Paris
101        | Lagos
102        | London
102        | New York

我正在使用Laravel Eloquent模型来尝试解决此问题,但我不断获得同一产品的多行。

我想要得到的结果:

$result = 
{ 
  {"Rice", 
    45.00, 
    101, 
    location: {"Chicago", "Paris", "Lagos"}
  },
  {"Beans", 
    30.00, 
    102, 
    location: {"London", "New York"}
  }
}

任何提供的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您要在Laravel中检索模型。因此,首先创建您的产品和位置模型。

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // if you have no standard table naming
    protected $table = 'products';

    public function products()
    {
        // you have to specify the foreign key is Product id as it does not follow the laravel standard
        $this->hasMany(Location::class, 'Product_id');
    }
}

class Location extends Model
{
    // if you have no standard table naming
    protected $table = 'locations';

    public function product()
    {
        return $this->belongsTo(Product::class, 'Product_id');
    }
}

这意味着您现在可以检索产品。加上位置即可使其达到最佳效果。

$products = Product::with('locations')->get();

现在,表绑定在一起的方式将在产品中具有多个位置。您可以像这样检索em。对于类似于您的结构。您的JSON完全无效。

$products = $products->map(function($product) {
    $product->location = $product->locations->map(function($location){
        return $location->location;
    });

    return $product;
})

您仍然可能希望将产品转换为漂亮的JSON响应,与考虑中的问题相比,目前看来这很合适。