两个相同 models/tables 之间的两个关系
Two relationships between two same models/tables
问题
您好,我在尝试处理两个模型 (Laravel 5.5) 之间的两种关系时遇到了一些问题:Order
和 User
。
1-----米 |一个User
(作为客户)可以赚很多Order
1-----米 |一个 User
(作为雇员)可以占用许多 Order
秒
所以,在我的 orders
table 中,我有 user_id
和 employee_id
作为外键。
现在,有些订单没有初始值 employee_id
因为订单需要被接受,然后我设置了那个值。
使用 tinker,我找到了这个 Order
对象 (id:30),它有一个 user_id
和一个 employee_id
但是当我 dd()
它时,这个 returns:
=> App\Models\Order {#882
order_id: 30,
user_id: 7, // <-- foreign key
employee_id: 6, // <-- foreign key
restaurant_id: 4, // <-- foreign key (for other table)
// ...
total: "120.00",
created_at: "2018-01-31 00:15:41",
updated_at: "2018-01-31 00:15:41",
deleted_at: null,
restaurant: App\Models\Restaurant {#900 // <- MY RESTAURANT RELATION (M-1)
restaurant_id: 4,
name: "Stark, Padberg and Buckridge",
// ...
// ...
created_at: "2018-01-12 18:18:17",
updated_at: "2018-01-12 18:18:17",
deleted_at: null,
},
customer: App\Models\User {#914 // <- MY CUSTOMER RELATION (M-1)
user_id: 7,
restaurant_id: 4,
// ...
created_at: "2018-01-30 17:52:33",
updated_at: "2018-01-30 23:32:00",
deleted_at: null,
},
deliverer: null, // <-- THIS SHOULD CONTAIN THE EMPLOYEE DATA
// THAT BELONGS TO THE DELIVERER RELATION
}
我做错了什么?
-----
我的逻辑信息。
型号
订单
在我的 Order
模型中,我定义了关系(以及其他关系)如下(我所有的主键都遵循此约定:model_id
):
/**
* Return the user who created the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function customer()
{
return $this->belongsTo(
'App\Models\User',
'user_id',
'user_id'
);
}
/**
* Return the employee (user) who deliver the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function deliverer()
{
return $this->belongsTo(
'App\Models\User',
'employee_id',
'user_id'
);
}
用户
/**
* A customer can make many orders
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function ordersMade()
{
return $this->hasMany('App\Models\Order',
'user_id',
'user_id'
);
}
/**
* An employee attends many orders.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function ordersDelivered()
{
return $this->hasMany('App\Models\Order',
'employee_id',
'user_id'
);
}
表格
这是我的架构 orders
table:
这是我的架构 users
table:
更新
是的,我的用户 ID 为 6
和 7
:
我在 Tinker 中完成了:
>>> $o = App\Models\Order::find(30);
>>> $o->customer;
>>> $o->restaurant;
>>> $o->deliverer;
>>> $o;
嗯,我的代码没有任何问题。我在我的模型上将 softDeletes
设置为 true
,因此我试图获得 "deleted" 元素的 属性。
就这么简单。感谢@MahdiYounesi,他让我检查了一下。
虽然这个问题几乎是一个愚蠢的问题,但值得一提的是,当您从实体查询时还需要 return softDeleted
记录时,您可以 -as docs 说-在每个需要这种结果的查询中添加 withTrashed()
,或者在定义关系时直接在模型中添加:
/**
* Return the user who created the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function customer()
{
return $this->belongsTo(
'App\Models\User',
'user_id'
)->withTrashed();
}
/**
* Return the employee (user) who deliver the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function deliverer()
{
return $this->belongsTo(
'App\Models\User',
'employee_id',
'user_id'
)->withTrashed();
}
这将收集 "deleted" 数据,例如对历史信息有用。
问题
您好,我在尝试处理两个模型 (Laravel 5.5) 之间的两种关系时遇到了一些问题:Order
和 User
。
1-----米 |一个User
(作为客户)可以赚很多Order
1-----米 |一个 User
(作为雇员)可以占用许多 Order
秒
所以,在我的 orders
table 中,我有 user_id
和 employee_id
作为外键。
现在,有些订单没有初始值 employee_id
因为订单需要被接受,然后我设置了那个值。
使用 tinker,我找到了这个 Order
对象 (id:30),它有一个 user_id
和一个 employee_id
但是当我 dd()
它时,这个 returns:
=> App\Models\Order {#882
order_id: 30,
user_id: 7, // <-- foreign key
employee_id: 6, // <-- foreign key
restaurant_id: 4, // <-- foreign key (for other table)
// ...
total: "120.00",
created_at: "2018-01-31 00:15:41",
updated_at: "2018-01-31 00:15:41",
deleted_at: null,
restaurant: App\Models\Restaurant {#900 // <- MY RESTAURANT RELATION (M-1)
restaurant_id: 4,
name: "Stark, Padberg and Buckridge",
// ...
// ...
created_at: "2018-01-12 18:18:17",
updated_at: "2018-01-12 18:18:17",
deleted_at: null,
},
customer: App\Models\User {#914 // <- MY CUSTOMER RELATION (M-1)
user_id: 7,
restaurant_id: 4,
// ...
created_at: "2018-01-30 17:52:33",
updated_at: "2018-01-30 23:32:00",
deleted_at: null,
},
deliverer: null, // <-- THIS SHOULD CONTAIN THE EMPLOYEE DATA
// THAT BELONGS TO THE DELIVERER RELATION
}
我做错了什么?
-----
我的逻辑信息。
型号
订单
在我的 Order
模型中,我定义了关系(以及其他关系)如下(我所有的主键都遵循此约定:model_id
):
/**
* Return the user who created the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function customer()
{
return $this->belongsTo(
'App\Models\User',
'user_id',
'user_id'
);
}
/**
* Return the employee (user) who deliver the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function deliverer()
{
return $this->belongsTo(
'App\Models\User',
'employee_id',
'user_id'
);
}
用户
/**
* A customer can make many orders
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function ordersMade()
{
return $this->hasMany('App\Models\Order',
'user_id',
'user_id'
);
}
/**
* An employee attends many orders.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function ordersDelivered()
{
return $this->hasMany('App\Models\Order',
'employee_id',
'user_id'
);
}
表格
这是我的架构 orders
table:
这是我的架构 users
table:
更新
是的,我的用户 ID 为 6
和 7
:
我在 Tinker 中完成了:
>>> $o = App\Models\Order::find(30);
>>> $o->customer;
>>> $o->restaurant;
>>> $o->deliverer;
>>> $o;
嗯,我的代码没有任何问题。我在我的模型上将 softDeletes
设置为 true
,因此我试图获得 "deleted" 元素的 属性。
就这么简单。感谢@MahdiYounesi,他让我检查了一下。
虽然这个问题几乎是一个愚蠢的问题,但值得一提的是,当您从实体查询时还需要 return softDeleted
记录时,您可以 -as docs 说-在每个需要这种结果的查询中添加 withTrashed()
,或者在定义关系时直接在模型中添加:
/**
* Return the user who created the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function customer()
{
return $this->belongsTo(
'App\Models\User',
'user_id'
)->withTrashed();
}
/**
* Return the employee (user) who deliver the order.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function deliverer()
{
return $this->belongsTo(
'App\Models\User',
'employee_id',
'user_id'
)->withTrashed();
}
这将收集 "deleted" 数据,例如对历史信息有用。