15

当我想更新FaqTrans数据库时,但是这个数据集有两个主键(faq_ida 和 lang)$table->primary(array('lang', 'faq_id'));。所以我不需要id带有 auto_increment 的列。

但是,当我使用以下代码更新数据库时,错误消息提示我没有id列。

$faq_trans = FaqTrans::where('faq_id','=',$faq_id)->where('lang','=',$lang)->first();
$faq_trans->lang  = Input::get('lang');
$faq_trans->body  = Input::get('body');
$faq_trans->title = Input::get('title');
$faq_trans->save();

错误信息

SQLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列 'id'(SQL:更新FAQtransbody= ?,updated_at= ? where idis null)(绑定:数组(0 => 'adfadaaadfadaa',1 =>' 2013-07-04 11:12:42',))

当我添加一id列时,代码工作正常......

有什么办法可以在没有 ID 列的情况下更新数据库?

4

6 回答 6

34

将此行写入您的模型

public $primaryKey = '_id';

其中 _id 是您的手动主键

于 2014-05-14T12:35:07.670 回答
7

很简单:

FaqTrans::where(
            [
                'faq_id' => $faq_id,
                'lang' => $lang
            ]
        )->update(
            [
                'body' => $body,
                'title' => $title
            ]
        );
于 2014-10-09T12:27:51.207 回答
6

Laravel / Eloquent 不支持复合主键。

查看 Eloquent Model 类时,可以看到主键只能是字符串,用于创建 WHERE 子句。

于 2013-07-04T09:21:25.133 回答
5

对于将来偶然发现这个问题的任何人(就像我一样),这是 Eloquent 中复合主键的一个很好的解决方法。

这位于模型类的顶部:

protected $primaryKey = array('key1', 'key2');

然后你用这个覆盖save()你的模型上的方法:

public function save(array $options = array())
{
    if(!is_array($this->getKeyName()))
        return parent::save($options);

    // Fire Event for others to hook
    if($this->fireModelEvent('saving') === false)
        return false;

    // Prepare query for inserting or updating
    $query = $this->newQueryWithoutScopes();

    // Perform Update
    if ($this->exists) {
        if (count($this->getDirty()) > 0) {
            // Fire Event for others to hook
            if ($this->fireModelEvent('updating') === false)
                return false;

            // Touch the timestamps
            if ($this->timestamps)
                $this->updateTimestamps();

            //
            // START FIX
            //

            // Convert primary key into an array if it's a single value
            $primary = (count($this->getKeyName()) > 1) ? $this->getKeyName() : [$this->getKeyName()];

            // Fetch the primary key(s) values before any changes
            $unique = array_intersect_key($this->original, array_flip($primary));

            // Fetch the primary key(s) values after any changes
            $unique = !empty($unique) ? $unique : array_intersect_key($this->getAttributes(), array_flip($primary));

            // Fetch the element of the array if the array contains only a single element
            $unique = (count($unique) <> 1) ? $unique : reset($unique);

            // Apply SQL logic
            $query->where($unique);

            //
            // END FIX
            //

            // Update the records
            $query->update($this->getDirty());

            // Fire an event for hooking into
            $this->fireModelEvent('updated', false);
        }

    // Perform Insert
    } else {
        // Fire an event for hooking into
        if ($this->fireModelEvent('creating') === false)
            return false;

        // Touch the timestamps
        if ($this->timestamps)
            $this->updateTimestamps();

        // Retrieve the attributes
        $attributes = $this->attributes;

        if ($this->incrementing && !is_array($this->getKeyName()))
            $this->insertAndSetId($query, $attributes);
        else
            $query->insert($attributes);

        // Set exists to true in case someone tries to update it during an event
        $this->exists = true;

        // Fire an event for hooking into
        $this->fireModelEvent('created', false);
    }

    // Fires an event
    $this->fireModelEvent('saved', false);

    // Sync
    $this->original = $this->attributes;

    // Touches all relations
    if (array_get($options, 'touch', true))
        $this->touchOwners();

    return true;
}

原文来源:https ://github.com/laravel/framework/issues/5517#issuecomment-52996610

2016-05-03 更新

我最喜欢的新方法:

如何在 Laravel 5 的模型中放置复合键?

于 2015-01-27T06:44:35.727 回答
1

转到您的FaqTrans模型并添加它。

public $key = 'faq_id';

应该这样做,假设faq_idlang

于 2013-07-18T06:24:38.687 回答
-2

如果有人有同样的问题。我使用了 Nishchit Dhanani 的答案,效果很好,那就是: 将此行写入您的模型
public $primaryKey = '_id';
其中 _id 是您的手动主键

对于我的情况。我有一个用户表,我的部分用户是学生。所以我的学生表中的主键是“user_id”。
在我的学生模型中添加这一行: public $primaryKey = 'user_id';

更新我的学生对象时,我能够使用 save() 方法。

希望这可以帮助

于 2017-05-10T04:53:00.923 回答