2016-12-21 37 views
5

Mam dwie tabele w mojej bazie danych - vnames i vtypes
vtypes mają pole name i pole id, vnames mają pole id, pole name i pole vtypes_id, które jest polem połączonym z kluczem obcym . Jest on połączony z polem id w vtypes.Łączenie dwóch tabel w mysql

mam modele Vname i Vtype -

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'); 
    } 
} 

Kiedy usunąć dowolną kolumnę w tabeli vtype chcę usunąć wszystkie Vname powiązane kolumny. znalazłem rozwiązanie takiego -

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

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

ale gdy uruchamiam tej funkcji pojawia się błąd jak ten - Call to undefined method Illuminate\Database\Query\Builder::detach()

Jak mogę to naprawić?

A gdy chcę uzyskać nazwę wtyku z vname, nie jestem w stanie tego zrobić. Starałem się ten

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

w widoku

ale mam błąd jak ten - Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

proszę kierować mi jak to naprawić dwa problemy, które stoją teraz ja.

Odpowiedz

2

Twoja relacja powinna być tak:

Vname model

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'); 
    } 
} 

Następnie można użyć delete sposób usunąć relacje jak:

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

A Pana zdaniem powinno być tak:

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

Docs

+0

kiedy robię '$ vtype-> vname() -> delete(); 'Otrzymuję błąd podobny do tego' SQLSTATE [42S22]: Nie znaleziono kolumny: 1054 Nieznana kolumna 'vtypes.vtypes_id' w 'where klauzula' (SQL: usuń z 'vtypes', gdzie 'vtypes'. 'vtypes_id' = 2 i ' vtypes '.' vtypes_id 'is not null) ' – Conor

+0

Czy możesz zamieścić zaktualizowany' Model' w swoim pytaniu? –

+0

Pytanie zaktualizowane. – Conor

2

Proszę używać ...

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

zamiast $vtype->vname()->detach(); ... Problem rozwiązany! Dla odwrotności tego, możesz vname->vtype() możesz ... dissociate() metoda ... która ustawi vtype_id na wartość null w tabeli vname. Więcej wyjaśnień here

Odłączenie jest używane dla relacji belongsToMany() - belongsToMany() ... Twoja jest hasMany() - belongsTo().

Ponadto, zamiast robić {{ $vname->vtype()->name }}

proszę

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

Powodem tego jest ... kiedy można umieścić wsporniki przed nazwą relacji, wywołuje konstruktor zapytania .. Ale tutaj, potrzebujesz tego modelu ... Więc $vname->vtype da Ci Vtype Model, podczas gdy $vname->vtype() dostaniesz narzędzie do budowania zapytań.

+0

kiedy robię $ vtype-> Vname() -> Usuń(); Otrzymuję błąd podobny do tego SQLSTATE [42S22]: Nie znaleziono kolumny: 1054 Nieznana kolumna "vtypes.vtypes_id" w 'where klauzula' (SQL: usuń z 'vtypes', gdzie 'vtypes'. 'vtypes_id' = 2 i "vtypes" .'vtypes_id 'nie jest pusty) – Conor

+0

Proszę zmienić swoją relację z 'App \ Vname' w relacji' hasMany() '. -> 'return $ this-> hasMany ('App \ Vname', 'vtypes_id', 'id');' – prateekkathal

+0

Tak, działało dzięki bro – Conor