带有 Eloquent 的 Laravel 不会在数据库中保存模型属性

Posted

技术标签:

【中文标题】带有 Eloquent 的 Laravel 不会在数据库中保存模型属性【英文标题】:Laravel with Eloquent doesn't save model properties on database 【发布时间】:2014-11-04 13:49:17 【问题描述】:

我正在使用 php laravel 框架构建一个网络应用程序。当我将模型保存在数据库中时,它会进行插入但不保存模型属性。我看不到如何修复,因为 laravel 日志没有显示任何错误。有什么想法吗?

有型号:

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'test';
//  protected $fillable = array('name', 'surname', 'mobile', 'phone', 'mail', 'adress');

// Model properties
private $name;
private $surname;
private $mobile;
private $phone;
private $mail;
private $adress;

// Model constructor
function __construct($name, $surname, $mobile, $phone, $mail, $adress) 
    $this->name = $name;
    $this->surname = $surname;
    $this->mobile = $mobile;
    $this->phone = $phone;
    $this->mail = $mail;
    $this->adress = $adress;

还有创建 User 对象并将其保存到数据库的 php 代码

<?php

// Create an object using model's constructor
$user = new User('John', 'Doe', 685412578, 9354784125, 'j@doe.com', 'Portland');

// Show some properties
echo '<p>'.$user->getName().'</p>';
echo '<p>'.$user->getSurname().'</p>';

// Saving model on database
$user->save();

?>

当我执行 php 代码在屏幕上显示模型属性并进行插入但不保存属性时。如果有人可以帮助我,那就太好了:)


有解决办法(如果有人有相同或类似的问题)

型号:

    protected $table = 'test';

    // Fields on databse to save model properties
    protected $fillable = array('name', 'surname', 'mobile', 'phone', 'mail', 'adress');

    // Model properties
    private $name;
    private $surname;
    private $mobile;
    private $phone;
    private $mail;
    private $adress;

和php代码:

 <?php

        // Create an object
                    $user = User::create(array(
                        'name'=>'John', 
                        'surname'=>'Doe', 
                        'mobile'=>685412578, 
                        'phone'=>9354784125, 
                        'mail'=>'j@doe.com', 
                        'adress'=>'Portland'
                        ));

        // Show some properties
        echo '<p>'.$user->name.'</p>';
        echo '<p>'.$user->surname.'</p>';

        // Saving model on database
        $user->save();

    ?>

【问题讨论】:

谢谢lowends 和watcher 都是正确的,现在正在工作。非常感谢! 【参考方案1】:

如http://laravel.com/docs/eloquent#mass-assignment 所述,您需要为所有要批量分配的属性设置$fillable 属性。因此,您应该取消注释以 protected $fillable = ... 开头的行。

【讨论】:

【参考方案2】:

您无需在模型本身中指定为特定模型存储的列名。 ORM 的目的之一是免除您的这一责任。您所拥有的显然也不起作用,因为 Eloquent 的 getter/setter 是在父类中指定的,但您将属性本身定义为 private,这是任何父/子范围都无法访问的。

我的建议:从您的模型中完全删除这些行:

private $name;
private $surname;
private $mobile;
private $phone;
private $mail;
private $adress;

也删除那里的构造函数。如果要创建实例并将其存储在数据库中,可以这样做:

$user = User::create(array(
    'name' => 'John',
    'surname' => 'Doe',
    // ... etc
));

稍后您可以轻松访问此实例的属性:

echo $user->name;

【讨论】:

【参考方案3】:

您不需要在构造函数中指定这些。你可以使用mass-assignment

型号:

class User extends Eloquent 

protected $fillable = ['name', 'suname', 'mobile', 'phone', 'mail', 'address'];


控制器:

$user = new User(['name' => 'John', 'surname' => 'Doe', 'mobile' => '685412578', 'phone' => '9354784125','mail' => 'j@doe.com', 'address' => 'Portland']);

$user->save();

【讨论】:

【参考方案4】:

您的模型扩展的Eloquent 类无法访问属性,因为您将它们声明为private。您可以不直接在模型上指定属性,也可以将它们声明为 protectedpublic,然后 Eloquent 将可以访问它们并将它们保存到您的数据库中。

【讨论】:

【参考方案5】:
class User extends Model 

    protected $table = 'users';

    public $timestamps = false;


【讨论】:

请解释你的答案。

以上是关于带有 Eloquent 的 Laravel 不会在数据库中保存模型属性的主要内容,如果未能解决你的问题,请参考以下文章

带有 Codeception 的 Laravel 4 模型单元测试 - 未找到“Eloquent”类

Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)

Laravel Eloquent 关系与多个带有“OR”的外键

Laravel Eloquent,返回带有“belongsTo”对象的 JSON?

Laravel Eloquent 查询,带有连接、计数和分组依据

即使在 Laravel eloquent 中设置后,表名也不会改变?