Laravel 一对多(多态)关系

Posted

技术标签:

【中文标题】Laravel 一对多(多态)关系【英文标题】:Laravel one to many (polymorphic) relationship 【发布时间】:2019-02-16 15:51:01 【问题描述】:

我正在创建一个 Laravel 项目,其中 Admins & Executives 可以拥有客户。

管理模式

public function clients()

    return $this->morphMany('App\Client', 'executable');

Client.php

public function executable()

    return $this->morphTo();

客户表

public function up()

    Schema::create('clients', function (Blueprint $table) 
        $table->increments('id');
        $table->string('name',100);
        $table->morphs('executable');
        $table->timestamps();
    );


/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()

    Schema::dropIfExists('clients');

一边做dd()

$data = App\Admin::find(1)->clients()->get(); 它返回 null

Collection #524 ▼
  #items: []

【问题讨论】:

【参考方案1】:

能否请您粘贴更多代码信息?

尤其是您如何播种 adminsclients 记录。

以下对我有用。

public function testRun()

    Artisan::call('migrate');

    $admin = new Admin();
    $admin->id = 1;
    $admin->save();

    $client = new Client();
    $client->id = 11;
    $client->name = 'name';
    $client->executable_id = 1;
    $client->executable_type = 'App\Admin';
    $client->save();

    dd(Admin::find(1)->clients()->get());

结果

Illuminate\Database\Eloquent\Collection #899
  #items: array:1 [
    0 => App\Client #900
      #connection: "sqlite"
      #table: "clients"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:6 [
        "id" => "11"
        "name" => "name"
        "executable_type" => "App\Admin"
        "executable_id" => "1"
        "created_at" => "2019-02-16 16:48:59"
        "updated_at" => "2019-02-16 16:48:59"
      ]
      ...

【讨论】:

非常感谢! @Kit Loong,它奏效了!问题是$client->executable_type = 'App\Admin';【参考方案2】:

一旦定义了数据库表和模型,您就可以通过模型访问关系。例如,要访问Admin 的所有clients,可以使用clients 动态属性:

$data = App\Admin::find(1)->clients;

【讨论】:

以上是关于Laravel 一对多(多态)关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 一对多关系和一对一关系

一对多和一对多的关系 laravel

Laravel:belongsTo()关系假设一对多关系而不是一对一

Laravel 一对多关系结果

Laravel 雄辩的一对多关系

在 Laravel 中同步一对多关系