Объединить один столбец из другой модели в одном измерении - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужен результат одного измерения для datatables.net.

Скажем, у меня есть эти 2 модели:

CustomerModel

class CustomerModel extends \sys\Model
{
    public $timestamps = false;

    protected $table = 'Customer';
    protected $primaryKey = 'customerId';

    protected $hidden   = [];
    protected $guarded  = [ 'customerId' ];


    public function paymentMethod(){
        return $this->hasOne('\app\model\PaymentMethodModel' , 'paymentMethodId' , 'paymentMethodId');
    }


    protected $fillable =
    [
       'customerName', 'address'
    ];          

}

PaymentMethodModel

class PaymentMethodModel extends \sys\Model
{
    public $timestamps = false;

    protected $table = 'PaymentMethod';
    protected $primaryKey = 'paymentMethodId';

    protected $hidden   = [];
    protected $guarded  = [ 'paymentMethodId' ];
    protected $fillable =
    [
       'paymentMethodName'
    ];          


}

Если я выберу использование CustomerModel, например AgentModel::with(['paymentMethod']);, я получу:

{
    "customerID": 1,
    "customerName": "John Doe"
    "address": "London"
    "payment_method": 
     {
         "paymentMethodId": 1,
         "paymentMethodName" : "Cash"
     }     
}

То, чего я хочу достичь, я хочу иметь paymentMethodName в результате в виде плоского объекта, как это:

{
    "customerID": 1,
    "customerName": "John Doe"
    "address": "London"
    "paymentMethodName" : "Cash"  
}

Горячий, чтобы достичь этого "Laravel", не играя с необработанным запросом?

1 Ответ

0 голосов
/ 18 февраля 2019

Использование ресурсов API Laravel - хороший пример использования, оно превращает модели в ответы API, прочитайте документацию здесь Ресурсы API .

Это довольно просто, начните с создания ресурсаНазовите это ресурсом клиента.Это преобразует вашу модель в ответ JSON.Это также полезно, если вы создаете обертку для некоторого унаследованного кода, тогда вы можете легко преобразовать модель в новую структуру.

use Illuminate\Http\Resources\Json\JsonResource;

class CustomerResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'customerID' => $request->customerId,
            'customerName' => $request->customerName,
            'address' => $request->address,
            'paymentMethodName' => $request->paymentMethod->paymentMethodName,
        ];
    }
}

Тогда в вашем коде контроллера API вы можете использовать ресурс API, как это делается.

return new CustomerResource($customerModel);

Это кажется большой работой для очень маленьких, но это решение, которое очень помогает вам, когда все становится сложным.Когда вы имеете дело с несколькими моделями, отношениями или аналогичными.Это предпочтительный способ, если кому-то интересно, Fractal - хорошая альтернатива этому, так как это был популярный выбор до создания ресурсов API Документация по Fractal .

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