【问题标题】:how to join tables where foreign key is not unique in one table in Laravel如何在 Laravel 的一个表中连接外键不唯一的表
【发布时间】:2019-07-11 14:09:42
【问题描述】:

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

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

Locations 表如下所示:

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"}
  }
}

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

【问题讨论】:

  • 正确的方式是将数据库更改为 3 个表并建立多对多关系。因为我认为来自芝加哥的产品可以不止一种。所以表products,表locations,表location_product(id,location_id,product_id)
  • 你能显示你当前的查询和你的模型的代码吗?
  • @Autista_z 您能否通过一个工作示例向我展示如何通过您的方法在一个选择语句中获得完整结果。谢谢。

标签: mysql arrays json laravel eloquent


【解决方案1】:

在 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();

现在,产品将有多个位置作为表格绑定在一起的方式。你可以像这样检索它们。对于类似于您的结构。你的 JSON 根本无效。

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

    return $product;
})

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

【讨论】:

  • 我同意这应该是一个多对多的关系,但最初的问题是如何在以下列结构中检索它,这就是你将如何使用 Laravel 的方式。由于这是一个非常基本的问题,我觉得采取婴儿步骤很重要。
  • 嘿@Martin Henriksen,我明白你刚刚在这里做了什么,但我希望能够在一个选择语句中获得完整的结果。向我展示一个工作示例将不胜感激。谢谢。
  • 您的 json 无效,这似乎让您越来越不想学习如何解决您的问题,而是希望有人解决您的问题。
  • 感谢您的意见,马丁。我有点发现如何让它工作而不必操纵我的模型结构。如果您有这种感觉,请道歉。我会接受你的回答,因为我从你的代码示例中知道了如何解决我的问题。
  • 如果您以我为例并从中有所收获,那么您的心态是正确的 :) 希望它能帮助您度过美好的一天。
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 2018-12-06
  • 2019-06-24
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多