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

$model->save() does not save object params Laravel 5.5

作为背景信息,我对 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->save(); 上方添加 $player->var1 = 10;,则数据库中的值为 10。

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

在这一部分,您声明自己的变量 $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; 时,变量 $var1private,您将无法访问它。
相反,php 将调用 __set() 魔术方法并将您的值存储在数组 $attributes 中。 这就是它在控制器上工作的原因。

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

要使其工作,您只需删除 $var1$var2 声明以强制 class 使用魔术方法 __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