我有几个模型,在多对多关系(我想)中,应该与以下内容相关:
我的诊所有许多实践领域(例如。牙科、精神病学、普通医学、内科等。并在几个全球大陆/世界地区、每个地区的许多国家和每个国家的许多城市开展业务。并非所有诊所分支机构都有相同的实践区域。
我的困难来自以下方面:
我的第一种方法太笨重,肯定无法工作,因为我试图用两个以上的ID构建一个透视表,而另一种方法是在一个表中完成(我认为这是绝对错误的)。
使用以下模型,设置数据库以使所有这些关系协同工作的最佳方法是什么:
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
}}
提前感谢您对如何最好地设置这一点的任何见解,因为事实上,我对这一高级层次的雄辩关系还很陌生。
根据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);
通过这种方式,可以在两侧进行多个查询——按城市、国家或地区划分的诊所分支机构或实践区域。