Ho 2 templates nella mia app, 'User' e 'MedicineType' (each Utente appartiene a un MedicineType).
Ho creato la relazione uno-a-molti tra due templates usando belongsTo () e hasMany (). hasMany () relazione funziona perfettamente ma belongTo () non funziona. Qualcuno sa where ho fatto un errore?
Utente :: find (1) -> medicine_type [questo non restituisce nulla]
MedicineType :: find (1) -> users [questo restituisce utenti]
Ecco il codice per i templates:
class MedicineType extends Eloquent { public function users() { return $this->hasMany('User'); } } class User extends Eloquent { public function medicine_type() { return $this->belongsTo('MedicineType'); } }
E qui è la mia struttura di database:
users: id name medicine_type_id medicine_types: id name
Il motivo per cui la relazione non funziona non è a causa delle relazioni specificate nel model, ma a causa della denominazione del metodo nel model Utente e non della chiave esterna.
Invece di:
public function medicine_type() { return $this->belongsTo('MedicineType'); }
Uso:
public function medicineType() { return $this->belongsTo('MedicineType', 'id'); }
Spero che questo funzioni per te;)
Tutto insieme:
<?php // app/models/MedicineType.php class MedicineType extends Eloquent { // Determines which database table to use protected $table = 'medicine_types'; public function users() { return $this->hasMany('User'); } }
e:
<?php // app/models/User.php class User extends Eloquent { // Determines which database table to use protected $table = 'users'; public function medicineType() { return $this->belongsTo('MedicineType', 'id'); } }
Verifica se funziona:
$user = User::find(1); return $user->medicineType->name;
Questo restituisce correttamente il nome del farmaco_type correlato.
Spero che questo ti aiuti ulteriormente;)
Forse c'è un problema con Eloquent nel trovare la chiave esterna. Prova questo:
class User extends Eloquent { public function medicine_type() { return $this->belongsTo('MedicineType', 'medicine_type_id'); } }
MODIFICARE:
Inoltre, Eloquent prova a trovare la tabella "medicinetypes" e non "medecine_types", quindi è necessario specificarlo utilizzando anche la variabile $table
.
class MedicineType extends Eloquent { protected $table = 'medicine_types'; public function users() { return $this->hasMany('User'); } }
Ho fatto lo stupido errore di non aggiungere il "return" nel metodo di relazione!
Assicurati di restituire la relazione … Ovviamente questo non functionrà:
public function medicineType() { $this->belongsTo('MedicineType', 'id'); }
Cambio "medicine_type" in "medicineType" e tutto è andato bene …