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我已经更新了我的答案。希望这能回答你的问题。我使用第二个应用程序