Laravel красноречивый выбор 1: n до 1: 1 - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема с пониманием в Laravel Eloquent.Я получил 4 таблицы в MySQL:

enter image description here

идентификаторы классов A и B одинаковы.Идентификаторы классов A и C одинаковы.Идентификатор класса 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;
}

Вы знаете другой способ сделать это?

Спасибо.

сообщение разрешено: лучший способ - использовать отношения: имеет много сквозных

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Точно так же, как thisiskelvin предложил в комментариях, вы можете взглянуть на hasManyThrough .

В противном случае, вы можете использовать методы сбора Laravel следующим образом:

$user = Utilisateurs::find($id);
$bs = $user->as()->map(function($a){
  return $a->b()->first();
})->filter(function($b){
  return $b;
})->toArray();
0 голосов
/ 09 октября 2018
$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

Это поможет.

0 голосов
/ 09 октября 2018
$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() в случаеnull as

$bs = optional($utilisateur->as)->map->b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...