我的数据库中有两个表 - vnames和vtypes
vtypes有一个名称字段和一个id字段,vnames有一个id字段,name字段和一个vtypes_id字段,它是一个外键连接字段。它与vtypes中的id字段相关联。
我有Vname和Vtype模型 -
VNAME
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Vname extends Model
{
public function vtype() {
return $this->belongsTo('App\Vtype');
}
}
V型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Vtype extends Model
{
public function vname() {
return $this->hasMany('App\Vtype');
}
}
当我删除vtype表中的任何列时,我想删除与之关联的所有vname列。 我找到了这样的解决方案 -
public function vtypeDestroy($id) {
$vtype = Vtype::find($id);
$vtype->vname()->detach();
$vtype->delete();
Session::flash('success', 'The vtype was successfully deleted');
return redirect('/vtypes');
}
但是当我运行此功能时,我收到这样的错误 - Call to undefined method Illuminate\Database\Query\Builder::detach()
我该如何解决?
当我想从vname获取vtype的名称时,我无法做到。我试过这个
@foreach ($vnames as $vname)
{{ $vname->vtype()->name }}
@endforeach
在视图中
但是我收到了这样的错误 - Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name
请指导我如何解决我现在面临的这两个问题。
答案 0 :(得分:2)
请使用......
$vtype->vname()->delete();
而不是$vtype->vname()->detach();
...问题解决了!相反,vname->vtype()
您可以使用dissociate()
方法...在 vname 表中将vtype_id
设置为null。更多解释here
分离用于belongsToMany() - belongsToMany()
关系......你的hasMany() - belongsTo()
。
此外,而不是{{ $vname->vtype()->name }}
请做
@foreach ($vnames as $vname)
{{ $vname->vtype->name }}
@endforeach
原因是......当您将括号放在关系名称前面时,它会调用查询构建器......但是在这里,您需要的是模型......所以$vname->vtype
将会为您提供 Vtype模型,而$vname->vtype()
将为您提供查询构建器。
答案 1 :(得分:2)
你的关系应该是:
Vname Model
class Vname extends Model
{
public function vtype() {
return $this->belongsTo('App\Vtype', 'vtypes_id', 'id');
}
}
V型
class Vtype extends Model
{
public function vname() {
return $this->hasMany('App\Vname', 'vtypes_id', 'id');
}
}
然后您可以使用delete
方法删除关系:
$vtype = Vtype::find($id);
$vtype->vname()->delete();
$vtype->delete();
在您看来,它应该是:
@foreach ($vnames as $vname)
{{ $vname->vtype->name }}
@endforeach