【问题标题】:Laravel Eloquent - Join 2 tables through other tableLaravel Eloquent - 通过其他表连接 2 个表
【发布时间】:2018-11-07 03:15:59
【问题描述】:

我通过第三个表在 2 个表之间建立关系。我总共有 3 张桌子。

1.) 地址

Schema::create('addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->text('line_1_number_building')->nullable();
    $table->text('line_2_number_street')->nullable();
    $table->text('line_3_area_locality')->nullable();
    $table->text('city')->nullable();
    $table->text('zip_code')->nullable();
    $table->text('state_province_county')->nullable();
    $table->text('country')->nullable();
    $table->longText('other_address_details')->nullable();
    $table->timestamps();
});

2.) 员工

Schema::create('staffs', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_category_id');
    $table->integer('gender_id');
    $table->text('staff_job_title')->nullable();
    $table->text('staff_first_name')->nullable();
    $table->text('staff_middle_name')->nullable();
    $table->text('staff_last_name')->nullable();
    $table->text('staff_qualifications')->nullable();
    $table->date('staff_birth_date');
    $table->longText('other_staff_details')->nullable();
    $table->timestamps();
});

3.) 员工地址

Schema::create('staff_addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_id');
    $table->integer('address_id');
    $table->date('date_address_from')->nullable();
    $table->date('date_address_to')->nullable();
    $table->timestamps();
});

现在我想获取任何员工条目的所有地址列表。我尝试了下面的代码,但它返回的地址与员工 ID 的 ID 匹配

我尝试了什么

public function saddresses()
{
    return $this->hasManyThrough('App\addresses','App\staff_addresses','staff_id','id');
}

我得到了什么

Address : [{"id":3,"line_1_number_building":"Hasan 2 line 1","line_2_number_street":"Hasan 2 line 2","line_3_area_locality":"Hasan 2 line 3","city":"Hasan 2 city","zip_code":"Hasan 2 zip code","state_province_county":"Hasan 2 state","country":"Hasan 2 country","other_address_details":"Hasan 2 other details","created_at":null,"updated_at":null,"staff_id":5},{"id":4,"line_1_number_building":"Sadiq 2 line 1","line_2_number_street":"Sadiq 2 line 2","line_3_area_locality":"Sadiq 2 line 3","city":"Sadiq 2 city","zip_code":"Sadiq 2 zip code","state_province_county":"Sadiq 2 state","country":"Sadiq 2 country","other_address_details":"Sadiq 2 other details","created_at":null,"updated_at":null,"staff_id":5}] 

Better view

你能指导我如何建立适当的关系吗?

问候, 哈桑·拉贾尼。

【问题讨论】:

  • 向你展示雄辩的控制器功能
  • 从您的表格看来,您可能需要 belongsToMany 关系。

标签: laravel laravel-5.7


【解决方案1】:

这个解决方案是完美的@Capt。提莫。但是,如果您想要特定员工的地址,那么我在这里提供了解决方案。

您必须在员工模型中定义此功能。

public function addresses() { return $this->belongsToMany('App\addresses'); }

查询获取$staffId的所有地址(其中$staffId是staff表的id)

$data = Staff::with('addresses')->where('id', $staffId)->first();

如果你想在数据透视表中获得额外的属性,你必须在定义关系时指定它们。

public function addresses() { return $this->belongsToMany('App\addresses')->withPivot('date_address_from', 'date_address_to'); }

另外,您可以在关系中使用withTimestamps 方法自动维护 created_at 和 updated_at 列。

供参考:https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

【讨论】:

  • 感谢 Vandit P. Kotadiya 的帮助和指导 :),但是我在这个网站 (laraveldaily.com/pivot-tables-and-many-to-many-relationships) 上为我的问题找到了另一个快速解决方案,然后在员工模型上创建了新功能“地址”然后在参数下添加了数据透视表名称和连接字段名称 ===> (return $this->belongsToMany('App\addresses','staff_addresses','staff_id','address_id');)
【解决方案2】:

首先,尝试修正您的命名约定。如果您遵循 laravel 的命名约定,事情会容易得多。 Here is the guide.

  • 数据透视表应该是按字母顺序排列的单数模型名称(将 staff_addresses 更改为 address_staff

然后使用belongsToMany 关系。

员工模特:

public function addresses()
{
    return $this->belongsToMany('App\addresses');
}

查询方式如下:

$data = Staff::with('addresses')->get();

【讨论】:

  • 感谢提莫船长指导我命名约定,这对我有很大帮助:)。其实我正在学习 laravel 并不确定许多功能和规则。
  • 对于我的问题,我发现这个解决方案很有帮助 (laraveldaily.com/pivot-tables-and-many-to-many-relationships) 在人员模型上创建了新函数“地址”,然后在参数下添加了数据透视表名称和连接字段名称 ===> ( return $this->belongsToMany('App\addresses','staff_addresses','staff_id','address_id');)
  • 如果你遵循 laravel 命名约定,你不需要在你的关系中指明表名 staff_addresses。 Laravel 会自动搜索 address_staff 作为枢轴,因为您正在加入 addressesstaffs 表。你的论点只是return $this->belongsToMany('App\addresses');
  • 是的,我明白了。我尝试更改命名约定并重新迁移,但它弄乱了我的整个设置,所以我认为在这个阶段采取这一步不是一个好主意。但是它将在下一个项目中帮助我:)。目前正在学习 laravel :) 我不想通过重做所有事情来失去兴趣。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2019-10-04
  • 2015-05-23
  • 1970-01-01
  • 2016-07-22
  • 2019-09-06
  • 1970-01-01
相关资源
最近更新 更多