$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 = 20
和 var2 = 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;
时,变量 $var1
是 private,您将无法访问它。
相反,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
作为背景信息,我对 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 = 20
和 var2 = 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;
时,变量 $var1
是 private,您将无法访问它。
相反,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