Laravel / Lumen-сериализация объекта
Хорошо у меня есть 2 модели в моем проекте Lumen , одна-Cars , а другая Users, отношение, которое у меня определено, заключается в том, что 1 user может иметь N Cars
Модель User
<?php
namespace App;
use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as
AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as
AuthorizableContract;
use App\Traits\ActiveOrInactiveModelTrait;
use App\Traits\UserModelTrait;
class User extends Model implements
AuthenticatableContract, AuthorizableContract, JWTSubject
{
use Authenticatable, Authorizable, ActiveOrInactiveModelTrait, UserModelTrait;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'email',
'password',
'status'
];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
'password',
];
/**
* Get all cars created by a user.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function pages_created()
{
return $this->hasMany('App\Cars', 'created_by');
}
}
Модель Cars
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\Traits\ActiveOrInactiveModelTrait;
use App\Traits\PageModelTrait;
class Cars extends Model
{
use ActiveOrInactiveModelTrait, PageModelTrait;
protected $fillable = [
'title',
'brand',
'created_by',
'updated_by',
'status',
];
public $relationships = array('creator');
/**
* Get the user who created the car.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function creator()
{
return $this->belongsTo('App\User', 'created_by');
}
}
У меня есть контроллер, который я делаю getCarsFromUser, который получает в качестве параметра идентификатор User, а затем в контроллере я делаю что-то вроде этого
try {
$user = User::find($id);
}
catch (\Exception $e) {
return response()->json([
'data' => new \stdClass(),
'response_text' => $e->getMessage()
], 500);
}
if ($user === null)
{
return response()->json([
'data' => new \stdClass(),
'response_text' => 'Resource Not Found'
], 404);
}
return response()->json([
'data' => $user,
'response_text' => 'OK'
], 200);
в принципе, если он находит пользователь возвращает его мне вместе со свойствами модели вместе с ответом 200, если идентификатор равен нулю, он возвращает мне ответ 400.
это работает, единственное, что, когда он возвращает мне свойство car, он возвращает мне массив car, то есть car [1,3,11], которые являются идентификаторами модели car, связанными с этим пользователем.
то, что я намерен сделать, это вернуть JSON, чтобы вернуть все пользовательские данные вместе со всеми данными каждого автомобиля, это сомнение.
1 answers
Как мы видим из документации (https://laravel.com/docs/5.6/eloquent-relationships#eager-loading) Laravel по умолчанию не загружает данные отношений, пока они не понадобятся.
Например, для случая вопроса
// Obtenemos la fila, pero no los datos de sus relaciones
$user = User::find($id);
// Al recorrer la relación es cuando se obtienen los datos
foreach ( $user->relacion as $fila) {
echo $fila->campo;
}
Уместно указать, что в приведенном выше случае Laravel сделает 1 + N запросов, то есть запрос для получения основной записи и еще один запрос для каждой строки отношения.
Есть случай, когда мы заинтересованы в получении всех данных тяги, не дожидаясь их необходимости или обхода, или если мы заранее знаем, что все данные отношения будут необходимы.
Для этих случаев мы можем использовать метод Laravel with()
. Это принесет нам все данные строки и их отношения только в 2 запросах.
Пример
$user = User::where('id', $id)->with('relacion')->get();
В этом случае данные отношения будут принесены сразу после приведения строки модель User