как объединить таблицы, где внешний ключ не уникален в одной таблице в Laravel - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть 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 Model, чтобы попытаться решить эту проблему, но продолжаю получать несколькостроки одного и того же продукта.

Что я хочу получить в результате:

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

Любая оказанная помощь будет высоко оценена.

1 Ответ

0 голосов
/ 18 февраля 2019

В 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');
    }
}

Это означает, что теперь вы можете получить свой продукт.С помощью include местоположений, чтобы он работал оптимально.

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

Теперь продукты будут иметь несколько местоположений в качестве способа соединения таблиц.Вы можете получить их так.Для структуры, похожей на вашу.Ты же JSON вообще недействителен.

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

    return $product;
})

Вы все еще, вероятно, хотите превратить продукты в симпатичный ответ JSON, а сейчас это кажется подходящим по сравнению с рассматриваемым вопросом.

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