【问题标题】:Laravel Eloquent ORM - save() returns column not found (MySQL error)Laravel Eloquent ORM - save() 返回未找到列(MySQL 错误)
【发布时间】:2014-08-29 12:38:48
【问题描述】:

我遇到的问题是我想保存模型,但我有一个写入实例的方法调用,并且由于某种原因 Laravel 正在尝试更新 那个 列。

俱乐部模式(相关代码):

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Club extends Eloquent 
{
    use SoftDeletingTrait;

    protected $table = 'clubs';
    protected $fillable = array('name', 'address', 'city', 'state', 'zip', 'contact_name', 'contact_email', 'contact_phone', 'contact_photo', 'club_code', 'logo');


    public function getCurrentCampaign($id = 0)
    {

        if (!$id)
        {
            if ($this->currentCampaign)
            {
                return $this->currentCampaign;
            }

            $id = $this->id;
        }

        $now = date('Y-m-d H:i:s');
        $this->currentCampaign = DB::table('campaigns')
            ->where('club_id', $id)
            ->where('start_date', '<=', $now)
            ->where('end_date', '>=', $now)
            ->pluck('id');

        return $this->currentCampaign;
    } 
}

问题存在于“俱乐部设置”页面上,用户可以在其中编辑一些内容 - 我有一些更新在不同的表上运行,然后我使用 $club-&gt;save()。我发现即使在getCurrentCampaign之后直接调用它也会抛出错误。

    $club = Club::findOrFail($clubID);
    $club->getCurrentCampaign();
    $club->save(); // Error

错误信息: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'currentCampaign' in 'field list' (SQL: updateclubssetupdated_at= 2014-07-08 12:49:17,currentCampaign= 27 whereid= 23)

考虑到currentCampaign 不在$fillable 数组中,我不知道发生了什么。我是否误解了它的工作原理?

谢谢

编辑:为清楚起见,$club 中加载了一些不同的内容,而不仅仅是广告系列。我只是提供一个用于说明目的。

【问题讨论】:

    标签: php orm model laravel-4 eloquent


    【解决方案1】:

    您保存在模型对象上的不是属性的任何内容都将被视为属性/表列。为避免这种情况,您可以简单地在模型上声明这些属性:

    // Club model
    public $currentCampaign;
    

    那么使用您的代码不会导致您现在遇到的错误。

    无论如何,您可能应该考虑@watcher 提出的关于使用关系的建议,但这取决于您的应用。


    关于 fillable 数组 - 它与保存数据无关,而是用数据数组填充对象(质量分配):

    $model->fill($someArray);
    

    当您__construct 新对象、保存或更新提供数组等时调用此方法。

    【讨论】:

    • 明白了。这有点糟糕;我更喜欢它在我脑海中的工作方式,哈哈。
    • 这是因为当一个属性没有在类中定义时,它是不可访问的,所以 PHP 调用 __set() 方法,Eloquent 定义了该方法将该属性放入表列的列表中。我在模型使用的特征中定义的 private 属性遇到了同样的问题,而模型又将其子类化了。我的班级无权访问该属性,因为它是私有的并且在子类中不可见,因此该属性被误解为表格列。
    【解决方案2】:

    我认为您没有以“laravel 方式”指定您的广告系列关系。根本问题是您正在向模型添加一个属性,并且在保存期间,Eloquent 认为额外的非标准属性代表数据库中的一列,因此它试图将其保存为这样。

    这是我要解决的路径:

    public function campaigns()
    {
        // 'hasMany' may not be what you need, just guessing 
        // from what I see so far... 
        return $this->hasMany('Campaigns');
    }
    
    public function currentCampaigns($now)
    {
        return $this->campaigns
            ->where('start_date', '>', $now)
            ->where('end_date', '<', $now);
    }
    

    现在,给定一个“俱乐部”的实例,您可以像这样获取其当前的活动:

    $club->currentCampaigns(date('Y-m-d H:i:s'));
    

    上述关系取决于您在数据库中构建关系的方式。

    1. 如果您的俱乐部表有一个“campaign_id”字段,那么俱乐部模型与活动模型的关系将为belongsTo

    2. 如果第三个表中同时包含活动 ID 和俱乐部 ID,并且您可以确定哪些俱乐部与哪些活动相关,则该关系为 hasMany

    我也相信,如果您的 clubs 表中有 campaign_id,它需要存在于可填充数组中才能实际设置它。

    【讨论】:

    • 我明白你在说什么,但实际上重构这么多的项目有点太远了:(此外,不仅仅是广告系列有问题 - 还有更多加载到 $club 变量中的东西也会导致错误。这只是最容易解释的。
    • 我认为您的最终问题是您需要远离像那样动态定义模型的属性。 Eloquent 认为这些是列。
    • 啊,太糟糕了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2019-03-15
    • 2020-03-05
    • 2018-10-31
    相关资源
    最近更新 更多