Php 从一对多关系中删除记录
我有三张桌子: 用户Php 从一对多关系中删除记录,php,laravel,phpmyadmin,relationship,one-to-many,Php,Laravel,Phpmyadmin,Relationship,One To Many,我有三张桌子: 用户 id role email typable_id typable_type id name address avatar email residential_id id name city state 买家 id role email typable_id typable_type id name address avatar email residential_id id name city state 居民 id role email typable_i
id
role
email
typable_id
typable_type
id
name
address
avatar
email
residential_id
id
name
city
state
买家
id
role
email
typable_id
typable_type
id
name
address
avatar
email
residential_id
id
name
city
state
居民
id
role
email
typable_id
typable_type
id
name
address
avatar
email
residential_id
id
name
city
state
这是我的模型,展示了这种关系
User.php
public function typable()
{
return $this->morphTo();
}
public function residential()
{
return $this->belongsTo(Residential::class);
}
public function user()
{
return $this->morphMany(User::class, 'typable');
}
public function buyer()
{
return $this->hasMany(Buyer::class);
}
Buyer.php
public function typable()
{
return $this->morphTo();
}
public function residential()
{
return $this->belongsTo(Residential::class);
}
public function user()
{
return $this->morphMany(User::class, 'typable');
}
public function buyer()
{
return $this->hasMany(Buyer::class);
}
Residential.php
public function typable()
{
return $this->morphTo();
}
public function residential()
{
return $this->belongsTo(Residential::class);
}
public function user()
{
return $this->morphMany(User::class, 'typable');
}
public function buyer()
{
return $this->hasMany(Buyer::class);
}
如果我想删除该住宅,则需要删除该住宅的所有买家。与删除买家时也需要删除的用户相同。我该怎么做?这就是我的住宅控制器内部的销毁功能
常驻控制器
public function destroy(Request $request)
{
$residentials = Residential::find($request->input('id'));
$residentials->id = $request->input('id');
$residentials->name = $request->input('name');
$residentials->delete($residentials);
return response()->json($residentials);
}
public function destroy(Request $request)
{
$users = User::where('email', '=', $request->email)->first();
$buyers = Buyer::find($request->input('id'));
$buyers->id = $request->input('id');
$buyers->name = $request->input('name');
$buyers->delete($buyers);
$users->delete($users);
return response()->json($buyers);
}
我尝试将此代码放入destroy()中以删除买家(对于尚未删除的用户),但没有更改要删除的买家。
$Buyer=Buyer::where('residential_-id','=',$request->residential_-id)->first()代码>$bullers->删除($bullers)代码>
如果我想删除买家,这是我设法做到的代码,但用户也会被删除
买方控制器
public function destroy(Request $request)
{
$residentials = Residential::find($request->input('id'));
$residentials->id = $request->input('id');
$residentials->name = $request->input('name');
$residentials->delete($residentials);
return response()->json($residentials);
}
public function destroy(Request $request)
{
$users = User::where('email', '=', $request->email)->first();
$buyers = Buyer::find($request->input('id'));
$buyers->id = $request->input('id');
$buyers->name = $request->input('name');
$buyers->delete($buyers);
$users->delete($users);
return response()->json($buyers);
}
我希望有人能帮助并教我正确的方法。您可能需要注册以处理此问题:
class住宅扩展模型
{
//让我们用复数形式来表示HasMany关系。
公共功能买家()
{
返回$this->hasMany(买家::类);
}
受保护的静态函数启动()
{
静态::删除(函数($user){
//我使用的是高阶消息,请查看:https://laravel.com/docs/8.x/collections#higher-订购信息
$this->buyer->each->delete();
});
}
}
类买方扩展模型
{
//让我们用复数形式来表示MorpMany关系。
公共功能用户()
{
返回$this->morphMany(User::class,'typable');
}
受保护的静态函数启动()
{
静态::删除(函数($user){
$this->users->each->delete();
});
}
}
您只需删除控制器中的单个对象:
类驻留控制器
{
公共功能销毁(请求$Request)
{
$residential=residential::findOrFail($request->input('id'));
$residential->delete();
//框架将自动将其转换为JSON对象。
返回$住宅;
}
}
类买方控制器
{
公共功能销毁(请求$Request)
{
$buyer=buyer::findOrFail($request->input('id'));
$buyer->delete();
//框架将自动将其转换为JSON对象。
退回$PUTER;
}
}
您可能需要注册来处理:
class住宅扩展模型
{
//让我们用复数形式来表示HasMany关系。
公共功能买家()
{
返回$this->hasMany(买家::类);
}
受保护的静态函数启动()
{
静态::删除(函数($user){
//我使用的是高阶消息,请查看:https://laravel.com/docs/8.x/collections#higher-订购信息
$this->buyer->each->delete();
});
}
}
类买方扩展模型
{
//让我们用复数形式来表示MorpMany关系。
公共功能用户()
{
返回$this->morphMany(User::class,'typable');
}
受保护的静态函数启动()
{
静态::删除(函数($user){
$this->users->each->delete();
});
}
}
您只需删除控制器中的单个对象:
类驻留控制器
{
公共功能销毁(请求$Request)
{
$residential=residential::findOrFail($request->input('id'));
$residential->delete();
//框架将自动将其转换为JSON对象。
返回$住宅;
}
}
类买方控制器
{
公共功能销毁(请求$Request)
{
$buyer=buyer::findOrFail($request->input('id'));
$buyer->delete();
//框架将自动将其转换为JSON对象。
退回$PUTER;
}
}
方法1
您可以覆盖任何模型的删除功能
//Residential.php
public function delete()
{
$this->buyer->delete();
return parent::delete();
}
//Buyer.php
public function delete()
{
$this->user->delete();
return parent::delete();
}
现在,当您删除任何住宅记录时,该链将首先删除任何相关用户,然后删除买家,最后删除住宅记录
方法2
您可以使用each()
方法获取所有相关买家,然后获取所有相关用户
$residentials->buyer
->each(function ($b) {
$b->user->each(function ($u) {
$u->delete();
});
$b->delete();
});
$residentials->delete();
方法1
您可以覆盖任何模型的删除功能
//Residential.php
public function delete()
{
$this->buyer->delete();
return parent::delete();
}
//Buyer.php
public function delete()
{
$this->user->delete();
return parent::delete();
}
现在,当您删除任何住宅记录时,该链将首先删除任何相关用户,然后删除买家,最后删除住宅记录
方法2
您可以使用each()
方法获取所有相关买家,然后获取所有相关用户
$residentials->buyer
->each(function ($b) {
$b->user->each(function ($u) {
$u->delete();
});
$b->delete();
});
$residentials->delete();
您可以执行$this->users()->delete()
来简化KennyHorna的查询点。在这种情况下,这肯定有效。但如果用户模型包含更多事件,则不会触发这些事件。所以我的代码稍微好一点。那么就没有必要再在住宅控制器的destroy()
中放置任何查询了?哦,删除住宅的查询需要在那里,否则我怎么能删除它,对吗?@IrdinaZulkeflee我已经更新了我的答案。希望这能回答你的问题。你可以做$this->users()->delete()
来简化KennyHorna的查询点。在这种情况下,这肯定有效。但如果用户模型包含更多事件,则不会触发这些事件。所以我的代码稍微好一点。那么就没有必要再在住宅控制器的destroy()
中放置任何查询了?哦,删除住宅的查询需要在那里,否则我怎么能删除它,对吗?@IrdinaZulkeflee我已经更新了我的答案。希望这能回答你的问题。我使用第二个应用程序