Laravel雄辩地选择1:n至1:1

时间:2018-10-09 11:15:35

标签: php mysql laravel eloquent

我对Laravel雄辩有一个理解的问题。 我在mysql中有4个表:

enter image description here

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

3 个答案:

答案 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

这可以解决问题。