Hallo,
ich arbeite gerade mit Eloquent von Laravel und bekomme grade meine Datenbankstruktur nicht so abgebildet, wie ich es gerne hätte.
Folgende Tabellenstruktur besteht bereits:
Im späteren System sollen bei einem Nutzer nur die Profileinträge angezeigt werden, die über role_profile_field für eine Rolle definiert wurden. Die dazugehörigen Werte werden in user_profile gespeichert. Dabei möchte ich über User bspw. auf das Model UserProfile zugreifen (den Wert bekommen) und über UserProfile den dazugehörigen Namen aus profile_field erhalten.
Ich habe mich mittlerweile in den letzten Stunden so verzettelt, dass ich auch den Überblick verloren habe in den paar Models.
Wenn es gewünscht wird kann ich gerne meinen derzeitigen Stand noch posten.
Welche Beziehungen muss ich in den Models zwischen den Tabellen definieren?
Verstehe ich die Doku richtig, so muss ich eine BelongsToMany Beziehung definieren, wüsste dann aber nicht mehr wie ich die value in user_profile erreiche.
Edit:
Da ich mit Eloquent noch am Anfang stehe (vom Wissensstand und vom Aufbau) und ich nur das aus Laravel nutze und dazu kommt, dass solche Konstrukte häufiger vorkommen werden, würdet ihr mir eher zu einem anderen ORM-Framework raten?
Wichtig ist mir nach der einmaligen Definition ein einfaches Auslesen der Datenbank. Die Queries sollten dabei nicht exorbitant hoch sein. Daher fand ich das Eager-Loading interessant und wollte es mal Testweise in das Projekt einbauen.
Edit2:
Naja ich habe es jetzt so irgendwie hinbekommen, aber da es die erste Benutzung ist, würde ich dennoch gerne einmal ein Feedback bekommen:
User.php
ProfileField.php
UserProfile.php
Role.php
RoleProfile.php
Dieser Code
ergibt dann folgende Ausgabe:
Ich hätte lieber mit dem Objekt weitergearbeitet, aber dann ist es sehr umständlich an die ganzen Werte zu kommen.
Für jeden Kommentar bin ich dankbar
Gruß
Dreamwatcher
ich arbeite gerade mit Eloquent von Laravel und bekomme grade meine Datenbankstruktur nicht so abgebildet, wie ich es gerne hätte.
Folgende Tabellenstruktur besteht bereits:
Code:
profile_field id (PK,AI) name description user id (PK,AI) role_id (FK) email password user_profile user_id (PK,FK) profile_field_id (PK,FK) value role id (PK,AI) name role_profile_field role_id (PK,FK) profile_field_id (PK,FK) PK=Primary Key FK=Foreign Key AI=Auto Increment
Ich habe mich mittlerweile in den letzten Stunden so verzettelt, dass ich auch den Überblick verloren habe in den paar Models.
Wenn es gewünscht wird kann ich gerne meinen derzeitigen Stand noch posten.
Welche Beziehungen muss ich in den Models zwischen den Tabellen definieren?
Verstehe ich die Doku richtig, so muss ich eine BelongsToMany Beziehung definieren, wüsste dann aber nicht mehr wie ich die value in user_profile erreiche.
Edit:
Da ich mit Eloquent noch am Anfang stehe (vom Wissensstand und vom Aufbau) und ich nur das aus Laravel nutze und dazu kommt, dass solche Konstrukte häufiger vorkommen werden, würdet ihr mir eher zu einem anderen ORM-Framework raten?
Wichtig ist mir nach der einmaligen Definition ein einfaches Auslesen der Datenbank. Die Queries sollten dabei nicht exorbitant hoch sein. Daher fand ich das Eager-Loading interessant und wollte es mal Testweise in das Projekt einbauen.
Edit2:
Naja ich habe es jetzt so irgendwie hinbekommen, aber da es die erste Benutzung ist, würde ich dennoch gerne einmal ein Feedback bekommen:
User.php
PHP-Code:
class User extends \Illuminate\Database\Eloquent\Model {
protected $table = 'user';
protected $guarded = array('id');
public function role()
{
return $this->belongsTo('\Model\Role');
}
public function profileFields()
{
return $this->belongsToMany('\Model\ProfileField','user_profile','user_id');
}
public function userProfile()
{
return $this->hasMany('\Model\UserProfile','user_id');
}
}
PHP-Code:
class ProfileField extends Model{
protected $table = 'profile_field';
protected $guarded = array('id');
public function userProfile()
{
return $this->belongsToMany('\Model\UserProfile','user_profile','profile_field_id');
}
}
PHP-Code:
class UserProfile extends Model{
protected $table = 'user_profile';
protected $guarded = array('id');
public function user()
{
return $this->belongsTo('\Model\User','user_id');
}
public function profileField()
{
return $this->belongsTo('\Model\ProfileField','profile_field_id');
}
}
PHP-Code:
class Role extends Model{
protected $table = 'role';
protected $guarded = array('id');
public function users()
{
return $this->hasMany('\Model\User');
}
public function roleProfileFields()
{
return $this->belongsToMany('\Model\ProfileField','role_profile_field','role_id');
}
}
PHP-Code:
class RoleProfile extends Model{
protected $table = 'role_profile_field';
public function profileFields()
{
return $this->belongsToMany('\Model\ProfileField','profile_field_id');
}
public function roles()
{
return $this->belongsToMany('\Model\Role','role_profile_field','');
}
}
PHP-Code:
$users = User::where('id',2)->with('userProfile','userProfile.profileField')->get();
$arr = $users->toArray();
var_dump($arr);
Code:
array(1) { [0]=> array(7) { ["id"]=> int(2) ["role_id"]=> int(6) ["regstamp"]=> int(0) ["email"]=> string(20) "geschwärzt" ["password"]=> string(32) "***" ["user_profile"]=> array(2) { [0]=> array(4) { ["user_id"]=> int(2) ["profile_field_id"]=> int(1) ["value"]=> string(5) "Hans" ["profile_field"]=> array(3) { ["id"]=> int(1) ["name"]=> string(7) "vorname" ["description"]=> string(0) "" } } [1]=> array(4) { ["user_id"]=> int(2) ["profile_field_id"]=> int(2) ["value"]=> string(8) "Meier" ["profile_field"]=> array(3) { ["id"]=> int(2) ["name"]=> string(8) "nachname" ["description"]=> string(0) "" } } } } }
Für jeden Kommentar bin ich dankbar
Gruß
Dreamwatcher
Kommentar