$ model-> save()不保存对象参数Laravel 5.5

时间:2018-02-22 11:49:37

标签: laravel-5 laravel-eloquent

就像背景信息一样,我和PHP和Laravel相对较新。 我开始制作一个简单的应用程序,以获得PHP和Laravel的一些感受。在应用程序中,我想创建一个带有一些参数的对象,并将该对象保存在数据库中。

为此,我创建了一个迁移:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePlayersTable extends Migration
{
    public function up()
    {
        Schema::create('players', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->integer("var1")->default(0);
            $table->integer("var2")->default(0);
    }
    public function down()
    {
           Schema::dropIfExists('players');
    }
 }

我创建了一个模型(播放器):

namespace App;

use Illuminate\Database\Eloquent\Model;
use DB;
use Log;

class Player extends Model
{
    private $var1;
    private $var2;

    public function __construct($number)
    {
        $this->var1 = $number;
        $this->var2 = $number;
    }
}

一个控制器偏离课程(PlayerController):

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Player;

class PlayerController extends Controller
{
    public function index()
    {
        $player = new Player(20);
//      dd($player);
        $player->save();
    }

如果我取消注释dd($ player)我在浏览器中获得了一个json对象,这会向玩家显示var1 = 20var2 = 20什么是正确的。如果我检查数据库中的播放器,则var1和2为0.

如果我将$player->var1 = 10;添加到$player->save();之上,则数据库中的值为10.

为什么通过生成Player对象定义的vars的值没有存储,如果我在对象存在后更改var值,那么它是什么?

1 个答案:

答案 0 :(得分:1)

在这一部分,您声明了一个名为$var1$var2的变量。我猜你丢弃物品时,确实看到了你的价值观。

class Player extends Model
{
    private $var1;
    private $var2;

    public function __construct($number)
    {
        $this->var1 = $number;
        $this->var2 = $number;
    }
}

在Laravel中,值存储在名为$attributes的数组中 当您从控制器拨打$player->var1 = 10;时,变量$var1 私有,您将无法访问它。
相反,php将调用__set()魔术方法并将您的值存储在数组$attributes中。 这就是它从控制器开始工作的原因。

public function __set($key, $value)
{
    $this->setAttribute($key, $value);
}

要使其有效,您只需删除$var1$var2声明即可强制该类使用魔术方法__set()

class Player extends Model
{
    public function __construct($number)
    {
        $this->var1 = $number;
        $this->var2 = $number;
    }
}

More about __set() in laravel source code
More about setAttribute() in laravel source code

Documentation about __set() in PHP