laravel / framework

The Laravel Framework.
https://laravel.com
MIT License
32.43k stars 10.99k forks source link

when call toJson laravel model cause unlimited loop #21648

Closed 354651432 closed 7 years ago

354651432 commented 7 years ago

Description: call toJson method on laravel model caused unlimited loop

console.php

use App\Models\xsqOrder;
use Illuminate\Foundation\Inspiring;

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->describe('Display an inspiring quote');

Artisan::command('ddd', function () {
    $obj = xsqOrder::find("xxx");
    echo $obj->toJson();
});

xsqOrder.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class xsqOrder extends Model
{
    protected $table = "xsq_order";

    protected $with = ["orderEx"];

    protected $primaryKey = "orderId";

    public static $snakeAttributes = false;

    public function orderEx()
    {
        return $this->hasOne(XsqOrderEx::class, "orderId", "orderId");
    }
}

xsqOrderEx.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class xsqOrderEx extends Model
{
    protected $table = "xsq_order_ex";

    protected $appends = ["orderIdEx"];

    public static $snakeAttributes = false;

    public function order()
    {
        return $this->belongsTo(xsqOrder::class, "orderId", "orderId");
    }

    public function getOrderIdExAttribute()
    {
        return $this->order->orderId;
    }
}

table xsq_order and xsq_order_ex has the same field orderId xsqOrderEx, I only want to serialize field oderIdEx but it serialized field 'order' it cause the bug occur

themsaid commented 7 years ago

xsqOrder is loading xsqOrderEx which is loading xsqOrder inside its getOrderIdExAttribute() method, that's the loop you're causing.

354651432 commented 7 years ago

yes it is ,but i does not defined xsqOrderEx is loading xsqOrder