我对Laravel雄辩有一个理解的问题。 我在mysql中有4个表:
A和B类的ID相同。 A和C类的ID相同。类A的标识符可以在表B或表C中。
翻译成模型ORM:
class Utilisateurs extends Model
{
public function as()
{
return $this->hasMany(A::class);
}
}
class A extends Model
{
public function utilisateur()
{
return $this->belongsTo(utilisateur::class);
}
public function b()
{
return $this->hasOne(B::class);
}
public function c()
{
return $this->hasOne(C::class);
}
}
class B extends Model
{
public function A()
{
return $this->belongsTo(A::class);
}
}
class C extends Model
{
public function A()
{
return $this->belongsTo(A::class);
}
}
所以,我的问题是是否有一种方法可以从用户表中访问表B
我知道一种方法。
public function getB(int $id)
{
$user = Utilisateur::find($id);
$bs = array();
if($user){
$user->a()-each(function($item){
$b = $item->b()->first();
if($b){$bs[] = $b}
})
}
return $bs;
}
您知道另一种方法吗?
谢谢。
帖子已解决:最好的方法是使用这种关系:Has Many Through
答案 0 :(得分:1)
就像thisiskelvin在评论中建议的那样,您可以看看hasManyThrough。
否则,您可以按以下方式使用Laravel的Collection methods:
$user = Utilisateurs::find($id);
$bs = $user->as()->map(function($a){
return $a->b()->first();
})->filter(function($b){
return $b;
})->toArray();
答案 1 :(得分:0)
$utilisateur = Utilisateur::find(id);
// all the b models which belongs to the utilisateur.
$bs = $utilisateur->as->map->b;
// all the c models which belongs to the utilisateur.
$cs = $utilisateur->as->map->c
请注意,$bs
和$cs
是集合,而不是单个模型。
修改
在optional()
为空的情况下使用as
$bs = optional($utilisateur->as)->map->b;
答案 2 :(得分:0)
$utilisateur = Utilisateur::findorFail(id);
// Each and every B which belongs to the utilisateur.
$bs = $utilisateur->as->map->b;
// Each and every C which belongs to the utilisateur.
$cs = $utilisateur->as->map->c
这可以解决问题。