Laravel и MySQL с реляционными таблицами - PullRequest
0 голосов
/ 21 сентября 2018

Мне нужно создать API с laravel и PHP.Я создал API-маршруты для GET всех пользователей и GET всех устройств, связанных с пользователем.

Я создал следующие таблицы в mySQL:

Устройства:

increments('id');
string('name');
longText('description');

Таблица отношений между пользователями и устройствами:

increments('id');
unsignedInteger('user_id');
unsignedInteger('device_id');

foreign('user_id')->references('id')->on('users');
foreign('device_id')->references('id')->on('devices');

Переменные:

increments('id');
string('type');
unsignedInteger('device_id');
longText('description');

foreign('device_id')->references('id')->on('devices');

И модели имеют код отношения:

Модель пользователя:

public function deviceVariables() {
    return $this->hasMany('App\DeviceVariable');
}

public function devices()
{
    return $this->belongsToMany('App\Device');
}

Модель устройства:

public function users()
{
    return $this->belongsToMany('App\User');
}

public function variables()
{
    return $this->hasMany('App\DeviceVariable');
}

И наконец модель DeviceVariable:

public function device()
{
    return $this->belongsTo('App\Device');
}

public function user()
{
    return $this->belongsTo('App\User');
}

IЯ могу показать все устройства, связанные с аутентифицированным пользователем, но я не могу показать все переменные, связанные с устройствами, которые связаны с этим пользователем.

Этот код (метод индекса DeviceVariablecontroller) наиболее близок к получению переменных:

$counter = 1;
$arrayIndex = 0;
while($counter <= 10) {
    if(auth()->user()->devices()->find($counter)) {
        $variables[$arrayIndex] = auth()->user()->devices()->find($counter)->variables;
        $arrayIndex++;
    }
    $counter++;
}

Есть ли способ сделать массив из всех пользовательских устройств?'Идентификаторы и цикл через них? - или есть ли более умный способ получить все переменные всех устройств пользователя?

РЕДАКТИРОВАТЬ: Комментарий получил меня оба устройства, а также каждыйпеременные устройства.

$variables = auth()->user()->devices()->with('variables')->get();
return response()->json([
    'success' => true,
    'data' => $variables
]);

Как получить переменные ТОЛЬКО без информации об устройстве?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете использовать отношение BelongsToMany для непосредственного получения переменных:

public function variables()
{
    return $this->belongsToMany('App\DeviceVariable', 'device_user',
        null, 'device_id', null, 'device_id');
}

return response()->json([
    'success' => true,
    'data' => auth()->user()->variables
]);
0 голосов
/ 21 сентября 2018

Может быть что-то вроде этого:

$variables = auth()->user()->devices()->with('variables')->get();

Это приведет к загрузке отношений, которые были у устройств.

Для доступа только к пользовательским переменным вы можете использовать отношение has-many-throuth, как упомянуто в документации:

https://laravel.com/docs/5.7/eloquent-relationships#has-many-through

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...