提问者:小点点

Laravel模型间多对多的多关系


我有几个模型,在多对多关系(我想)中,应该与以下内容相关:

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

我的困难来自以下方面:

  1. 诊所遍布世界许多地区/大洲;
  2. 也是,在每个地区的许多国家
  3. 它也在每个国家的五月城市;
  4. 每个诊所都有自己的实践区;

我的第一种方法太笨重,肯定无法工作,因为我试图用两个以上的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
}}

提前感谢您对如何最好地设置这一点的任何见解,因为事实上,我对这一高级层次的雄辩关系还很陌生。


共1个答案

匿名用户

根据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);

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