我正在尝试使用它们的关系检索数据库行。但是,本地密钥是一个数组。让我用一个例子来解释。
假设我有一张国家/地区的表格。每个国家/地区可以有很多页面每个页面可以属于多个国家/地区。我无法灵活地更改此架构。
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方法检索关系,这样所有三个国家都会返回适当的页面?
提前致谢
答案 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;
}