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】:能否请您粘贴更多代码信息?
尤其是您如何播种 admins
和 clients
记录。
以下对我有用。
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 一对多(多态)关系的主要内容,如果未能解决你的问题,请参考以下文章