Laravel。如何获得外键是数组的关系

时间:2018-03-01 10:50:39

标签: laravel relationship

我正在尝试使用它们的关系检索数据库行。但是,本地密钥是一个数组。让我用一个例子来解释。

假设我有一张国家/地区的表格。每个国家/地区可以有很多页面每个页面可以属于多个国家/地区。我无法灵活地更改此架构。

pages
+-------------+-----------+
| id | name   | countries |
+-------------+-----------+
| 1  | Page 1 | 1         |
+-------------+-----------+
| 2  | Page 2 | 1,2,3     |
+-------------+-----------+
| 3  | Page 3 | 4,5,6     |
+-------------+-----------+

countries
+----+----------------+
| id | name           | 
+----+----------------+
| 1  | United States  |
+----+----------------+
| 2  | United Kingdom |
+----+----------------+
| 3  | Germany        |
+----+----------------+
| 4  | France         |
+----+----------------+
| 5  | Hong Kong      |
+----+----------------+
| 6  | Thailand       |
+----+----------------+
| 7  | Belgium        |
+----+----------------+
| 8  | Singapore      |
+----+----------------+

我的模型和控制器看起来像:

country 

public function pages()
{
    return $this->hasMany(Page::class, 'id', 'countries');
}

MemberController.php

$countries = Country::with('pages')->get();

这将返回所有国家/地区,但只有第1页包含任何关系。

有没有办法使用whereIn方法检索关系,这样所有三个国家都会返回适当的页面?

提前致谢

2 个答案:

答案 0 :(得分:0)

由于Page可以属于许多Countries,因此您需要创建一个名为country_page的数据透视表,并删除countries列。

然后在两个模型中定义两个belongsToMany()关系:

public function pages()
{
    return $this->belongsToMany(Page::class);
}

如果我的回购邮件中列出了not following Laravel naming conventions,并且您为枢轴名称指定了自定义名称,请同时对其进行定义:

public function pages()
{
    return $this->belongsToMany(Page::class, 'custom_pivot_table');
}

答案 1 :(得分:0)

像这样的东西?

$datas = Pages::where( ##your conditions### )->get()->inArray();
$countries = Countries::pluck('name','id'); // return array of id=>name

foreach($datas as $key=>$data) {

    $c = [];
    foreach(explode(',',$data['countries']) as $country_id) {
        $c[]=$countries[$country_id]; 
        //or 
        $c[]= ['id'=>$country_id,'name'=>$countries[$country_id]];
    }
    $datas[$key]['countries']= $c;
}