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, чтобы вернуть все пользовательские данные вместе со всеми данными каждого автомобиля, это сомнение.

Author: Xerif, 2018-02-20

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

 2
Author: Xerif, 2018-05-04 14:25:37