我有几个模型,应该以多对多关系(我认为)针对以下情况:
我的诊所有很多执业领域(例如牙科学,精神病学,普通医学,内科医学等),并且在全球多个大洲/世界地区,每个地区的许多国家和每个国家的许多城市中开展业务。诊所的分支机构具有相同的实践领域。
我遇到困难的原因是由于以下原因:
我的第一种方法太笨拙,不能肯定地起作用,因为我试图用两个以上的id构建一个数据透视表,另一个试图在一个表中进行操作(我认为这是绝对不正确的)。 / p>
使用以下模型,为所有这些关系设置数据库以使其协同工作的最佳方法是什么:
Models\Clinic::class;
Models\PracticeArea::class;
Models\WorldRegion::class;
Models\Country::class;
Models\City::class;
Models\Clinic::class;
public function areas() {
return $this->belongsToMny(PracticeArea::class, 'area_clinic_counrty', 'area_id', 'country_id', 'clinic_id');
}
为简化起见,该表单对每个地区和每个国家/地区都有多项选择(让我们在此处显示城市)。我想在发布json响应时通过对数据透视表使用sync()
方法来添加/更新/删除。例如:
data: {
clinic_id: 2,
practices: {
1: ["12","31], // the keys correspond to world region in this ex.
3: ["7", "12", "42"] // the values to practice areas ids
}}
预先感谢您对如何最好地进行设置的任何见解,因为事实上,我对这种高级级别的口才关系还很陌生。
答案 0 :(得分:0)
在Jonas Staudenmeir的建议和帮助之后,我最终用一个简单的数据透视表和关系的相应方法解决了这个问题。因此,以防万一,如果有人遇到相同的问题:
为数据透视表创建迁移
public function up()
{
Schema::create('address_area', function (Blueprint $table) {
$table->integer('address_id')->unsigned()->index();
$table->integer('area_id')->unsigned()->index();
$table->primary(['address_id', 'area_id']);
});
}
现在,在App\Models\Address::class
上添加了用于关系的方法:
/**
* Method to establish the relationship between the address and the practice areas
*
* @access public
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
* @since 1.0.1
*/
public function areas()
{
return $this->belongsToMany(PracticeArea::class);
}
另一方面,App\Models\PracticeArea::class
添加了用于关系的方法:
/**
* Method to establish the relationship between the practice areas and the address
*
* @access public
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
* @since 1.0.1
*/
public function address()
{
return $this->belongsToMany(Address::class);
}
现在,每次在诊所分支上添加或删除具有city_id
,country_id
和region_id
列的练习区域时,数据透视表便会同步:>
// synchronize (add/delete) entries on the pivot table
// $practices array of practice areas
$address->areas()->sync($practices);
通过这种方式,可以在双方进行多次查询-诊所分支机构或按城市,国家或地区划分的实践区域。