在mysql中连接两个表

时间:2016-12-21 04:02:17

标签: php mysql laravel

我的数据库中有两个表 - 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

请指导我如何解决我现在面临的这两个问题。

2 个答案:

答案 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

Docs