Laravel模型之间雄辩的多对多关系

时间:2018-08-12 10:15:54

标签: laravel eloquent many-to-many multiple-models

我有几个模型,应该以多对多关系(我认为)针对以下情况:

我的诊所有很多执业领域(例如牙科学,精神病学,普通医学,内科医学等),并且在全球多个大洲/世界地区,每个地区的许多国家和每个国家的许多城市中开展业务。诊所的分支机构具有相同的实践领域。

我遇到困难的原因是由于以下原因:

  1. 诊所在世界许多地区/大陆;
  2. 在每个地区的许多国家/地区也是如此
  3. 它也在每个国家的城市中
  4. 每个诊所分支机构都有自己的执业领域;

我的第一种方法太笨拙,不能肯定地起作用,因为我试图用两个以上的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
}}

预先感谢您对如何最好地进行设置的任何见解,因为事实上,我对这种高级级别的口才关系还很陌生。

1 个答案:

答案 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_idcountry_idregion_id列的练习区域时,数据透视表便会同步:

// synchronize (add/delete) entries on the pivot table
// $practices array of practice areas
$address->areas()->sync($practices);

通过这种方式,可以在双方进行多次查询-诊所分支机构或按城市,国家或地区划分的实践区域。