就像背景信息一样,我和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->var1 = 10;
添加到$player->save();
之上,则数据库中的值为10.
为什么通过生成Player对象定义的vars的值没有存储,如果我在对象存在后更改var值,那么它是什么?
答案 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