简体   繁体   English

如何在Laravel 4中使用不带id的Eloquent更新数据

[英]How can I update data with Eloquent without id in Laravel 4

When I want to update the FaqTrans database, but this datase have two primary key (faq_ida and lang) $table->primary(array('lang', 'faq_id')); 当我想更新FaqTrans数据库时,此数据集有两个主键(faq_ida和lang) $table->primary(array('lang', 'faq_id')); table- $table->primary(array('lang', 'faq_id')); . so I don't need a id column with auto_increment. 所以我不需要带有auto_increment的id列。

However, when I use the following code to update the database, the error message hint me there is no id column. 但是,当我使用以下代码更新数据库时,错误消息提示我没有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();

error message 错误信息

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: update FAQtrans set body = ?, updated_at = ? where id is null) (Bindings: array ( 0 => 'adfadaaadfadaa', 1 => '2013-07-04 11:12:42', )) SQLSTATE [42S22]:找不到列: FAQtrans子句'中的未知列'id'(SQL:update FAQtrans set body =?, updated_at =?,其中id为null)(绑定:数组(0 =>'adfadaaadfadaa', 1 =>'2013-07-04 11:12:42',))

and when I added an id column, the code works fine... 当我添加一个id列时,代码可以正常工作...

are there any way can I update the database without ID column ? 有什么方法可以更新没有ID列的数据库?

Write this line into your Model 将此行写入模型

public $primaryKey = '_id';

Where _id is your manual primary key _id是您的手动主键

Laravel / Eloquent doesn't support composite primary keys. Laravel / Eloquent不支持复合主键。

When you check the Eloquent Model class, you can see that the primary key can only be a string, which is used to create the WHERE clause. 当您检查Eloquent Model类时,您会看到主键只能是一个字符串,用于创建WHERE子句。

Pretty simple: 很简单:

FaqTrans::where(
            [
                'faq_id' => $faq_id,
                'lang' => $lang
            ]
        )->update(
            [
                'body' => $body,
                'title' => $title
            ]
        );

For anyone who stumbles upon this question in the future (like I did), here's a nice workaround for a composite primary key in Eloquent. 对于将来遇到这个问题的人(就像我一样),这是Eloquent中复合主键的一个不错的解决方法。

This goes at the top of your model class: 这是模型类的顶部:

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

Then you override the save() method on your model with this: 然后,您可以使用以下方法在模型上覆盖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;
}

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

Update 2016-05-03 更新2016-05-03

My new favorite way to do this: 我最喜欢的新方法:

How I can put composite keys in models in Laravel 5? 如何在Laravel 5中将组合键放在模型中?

Go to your FaqTrans model and add this. 转到您的FaqTrans模型并添加它。

public $key = 'faq_id';

That should do it, assuming faq_id is more important than the lang 假设faq_idlang更重要,就应该这样做

If anyone has the same issue. 如果有人有同样的问题。 I used Nishchit Dhanani answer and it worked pretty well which was: Write this line into your Model 我用Nishchit Dhanani答案,它工作得很好这是: 写这行到你的模型
public $primaryKey = '_id'; public $ primaryKey ='_id';
Where _id is your manual primary key _id是您的手动主键

For my case. 就我而言。 I had a user table and part of my users are students. 我有一个用户表,部分用户是学生。 So the primary key in my students table was "user_id". 因此,我的学生表中的主键是“ user_id”。
Adding this line in my Student model: public $primaryKey = 'user_id'; 在我的学生模型中添加以下行:public $ primaryKey ='user_id';

I was able to use the save() method when updating my student object. 更新学生对象时,我可以使用save()方法。

Hope this helps 希望这可以帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM