2016-12-21 30 views
5

Tôi có hai bảng trong cơ sở dữ liệu của tôi - vnames và vtypes
vtypes có trường tên và trường id, vnam có trường id, trường tên và trường vtypes_id là trường được kết nối ngoài . Nó được kết nối với trường id trong vtypes.Kết nối hai bảng trong mysql

Tôi có Vname và Vtype mô hình -

Vname

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Vname extends Model 
{ 
    public function vtype() { 
     return $this->belongsTo('App\Vtype'); 
    } 
} 

Vtype

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Vtype extends Model 
{ 
    public function vname() { 
     return $this->hasMany('App\Vtype'); 
    } 
} 

Khi tôi xóa bất kỳ cột nào trong bảng vtype tôi muốn xóa tất cả các vname các cột được liên kết với nó. Tôi tìm thấy một giải pháp như thế này -

public function vtypeDestroy($id) { 
    $vtype = Vtype::find($id); 
    $vtype->vname()->detach(); 
    $vtype->delete(); 

    Session::flash('success', 'The vtype was successfully deleted'); 
    return redirect('/vtypes'); 
} 

nhưng khi tôi chạy chức năng này tôi nhận được một lỗi như thế này - Call to undefined method Illuminate\Database\Query\Builder::detach()

Làm thế nào tôi có thể sửa chữa nó?

Và khi tôi muốn lấy tên của vtype từ vname tôi không thể làm điều đó. Tôi đã cố gắng như thế này

@foreach ($vnames as $vname) 
    {{ $vname->vtype()->name }} 
@endforeach 

trong một cái nhìn

Nhưng tôi đã nhận một lỗi như thế này - Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

Hãy hướng dẫn cho tôi làm thế nào để sửa lỗi này hai vấn đề mà tôi phải đối mặt bây giờ.

Trả lời

2

mối quan hệ của bạn nên được như:

Vname Mẫu

class Vname extends Model 
{ 
    public function vtype() { 
     return $this->belongsTo('App\Vtype', 'vtypes_id', 'id'); 
    } 
} 

Vtype

class Vtype extends Model 
{ 
    public function vname() { 
     return $this->hasMany('App\Vname', 'vtypes_id', 'id'); 
    } 
} 

Sau đó, bạn có thể sử dụng delete phương pháp để xóa các mối quan hệ như:

$vtype = Vtype::find($id); 
$vtype->vname()->delete(); 
$vtype->delete(); 

Và theo quan điểm của bạn nó nên càng:

@foreach ($vnames as $vname) 
    {{ $vname->vtype->name }} 
@endforeach 

Docs

+0

khi tôi làm '$ vtype-> vname() -> delete(); 'tôi nhận được một lỗi như thế này' SQLSTATE [42S22]: Cột không tìm thấy: 1054 Cột không xác định 'vtypes.vtypes_id' trong 'where clause' (SQL: xóa khỏi 'vtypes' trong đó 'vtypes'. 'vtypes_id' = 2 và ' vtypes '.' vtypes_id 'không phải là null) ' – Conor

+0

Bạn có thể đăng cập nhật' Mô hình' trong câu hỏi của mình không? –

+0

Câu hỏi đã được cập nhật. – Conor

2

Vui lòng sử dụng ...

$vtype->vname()->delete(); 

thay vì $vtype->vname()->detach(); ... Vấn đề được giải quyết! Đối với nghịch đảo của nó, vname->vtype() bạn có thể bạn dissociate() phương thức ... sẽ đặt vtype_id thành null trong vname bảng. Giải thích khác here

Tách được sử dụng cho mối quan hệ belongsToMany() - belongsToMany() ... của bạn là hasMany() - belongsTo().

Ngoài ra, thay vì làm {{ $vname->vtype()->name }}

hãy làm

@foreach ($vnames as $vname) 
    {{ $vname->vtype->name }} 
@endforeach 

Lý do cho điều này là ... khi bạn đặt các dấu ngoặc ở phía trước của tên mối quan hệ, nó gọi một người thợ xây truy vấn .. Nhưng ở đây, những gì bạn cần là mô hình ... Vì vậy, $vname->vtype sẽ cung cấp cho bạn Mẫu Vtype trong khi $vname->vtype() sẽ cung cấp cho bạn trình tạo truy vấn.

+0

khi tôi làm $ vtype-> vname() -> xóa(); tôi nhận được một lỗi như thế này SQLSTATE [42S22]: Cột không tìm thấy: 1054 Cột không xác định 'vtypes.vtypes_id' trong 'where clause' (SQL: xóa khỏi 'vtypes' trong đó 'vtypes'. 'vtypes_id' = 2 và 'vtypes' .'vtypes_id 'không phải là null) – Conor

+0

Vui lòng thay đổi quan hệ của bạn từ 'App \ Vname' trong quan hệ' hasMany() '. -> 'return $ this-> hasMany ('App \ Vname', 'vtypes_id', 'id');' – prateekkathal

+0

Có nó đã hoạt động nhờ bro – Conor

Các vấn đề liên quan