Laravel - как получить две модели или совместить их? - PullRequest
0 голосов
/ 03 августа 2020

Я понятия не имею, как сделать это лучше всего (используя отношения). У меня 3 модели:

1: пользователь

2: сервер

3: serverOwner

Я пробовал что-то подобное, но может ' t be.

return User::findOrFail(1)->servers::with('owners');

Мне нужно получить серверы, назначенные пользователю, и информацию, кто еще является владельцем. Вот как это будет выглядеть:

{
"name": "server 1",
"host": "xxx.com",
"owners": [
{
"id": 1,
"name": "user1"
}
]
}

Сможет ли кто-нибудь мне помочь?

Ответы [ 4 ]

0 голосов
/ 03 августа 2020

Простите, ребята. Но, думаю, я слишком глуп для этого. Я не должен был бросаться в такую ​​воду, но мне это нужно. Поскольку вы написали ответы, я попытался сделать это в соответствии с вашими инструкциями. Однако у меня также начались проблемы с построением отношений в моделях. Кто-то написал, что мне достаточно двух моделей - скорее, не работает, потому что у одного пользователя может быть много серверов, а у одного сервера может быть много пользователей. Вот мои модели:

class User extends Authenticatable
{
    public function servers()
    {
        return $this->belongsToMany('App\Server', 'owners');
    }
}


class Server extends Model
{
    public function owners()
    {
        // I got lost here. I don't even want to show it :D
    }
}


class Owner extends Model
{
    //
}

Могу ли я также попросить помощи / руководства с моделями?

Миграции:

Schema::create('servers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });


    Schema::create('owners', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained();
        $table->foreignId('server_id')->constrained();
        $table->timestamps();
    });
0 голосов
/ 03 августа 2020

Вы можете сделать это несколькими способами, но вы можете попробовать напрямую с экземпляра пользователя:

$servers = User::findOrFail(1)->servers()->with('owners')->get();

Вы также можете сделать это со стороны сервера, если необходимо.

0 голосов
/ 03 августа 2020

Следует использовать две модели: User и Server. Пользователь будет владельцем сервера.

class User extends Model{
      public function servers(){
           return $this->hasMany(Server::class);
      }
}
class Server extends Model{
      public function user(){
           return $this->belongsTo(User::class);
      }
}
return User::findOrFail(1)->with('servers')->get();
0 голосов
/ 03 августа 2020

если ваши отношения объявлены правильно, используйте это

return User::with('servers.owners')->findOrFail(1);

Вы также можете использовать его так:

return User::with(['servers' => function($server) {
    $server->with('owners');
})->findOrFail(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...