当前位置: 首页 > 面试题库 >

如何在Laravel 5中将组合键放在模型中?

步博涉
2023-03-14
问题内容

我的数据库中有一个带有两个主键(id和language_id)的表,需要将其放入模型中。模型中的默认primaryKey(Laravel
5中的Model.php)是id,我希望primaryKeys将是id和id_language。我尝试将其与数组或带’,’的字符串放在一起,但不起作用。它说我无法将数组转换为String。

请帮忙。

谢谢!


问题答案:

我写了这个简单的PHP特性,以使Eloquent能够处理复合键:

<?php

namespace App\Model\Traits; // *** Adjust this to match your model namespace! ***

use Illuminate\Database\Eloquent\Builder;

trait HasCompositePrimaryKey
{
    /**
     * Get the value indicating whether the IDs are incrementing.
     *
     * @return bool
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Set the keys for a save update query.
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    protected function setKeysForSaveQuery(Builder $query)
    {
        foreach ($this->getKeyName() as $key) {
            // UPDATE: Added isset() per devflow's comment.
            if (isset($this->$key))
                $query->where($key, '=', $this->$key);
            else
                throw new Exception(__METHOD__ . 'Missing part of the primary key: ' . $key);
        }

        return $query;
    }

    // UPDATE: From jessedp. See his edit, below.
    /**
     * Execute a query for a single record by ID.
     *
     * @param  array  $ids Array of keys, like [column => value].
     * @param  array  $columns
     * @return mixed|static
     */
    public static function find($ids, $columns = ['*'])
    {
        $me = new self;
        $query = $me->newQuery();
        foreach ($me->getKeyName() as $key) {
            $query->where($key, '=', $ids[$key]);
        }
        return $query->first($columns);
    }
}

将其放置在Traits主模型目录下的目录中,然后可以在任何复合键模型的顶部添加一个简单的单线:

class MyModel extends Eloquent {
    use Traits\HasCompositePrimaryKey; // *** THIS!!! ***

    /**
     * The primary key of the table.
     * 
     * @var string
     */
    protected $primaryKey = array('key1', 'key2');

    ...

由jessedp补充:
在我想使用Model :: find之前,这对我一直很有效,因此以下是一些可以添加到上述hasCompositePrimaryKey特性中的代码(可能会更好):

protected static function find($id, $columns = ['*'])
{
    $me = new self;
    $query = $me->newQuery();
    $i=0;

    foreach ($me->getKeyName() as $key) {
        $query->where($key, '=', $id[$i]);
        $i++;
    }

    return $query->first($columns);
}


 类似资料:
  • 问题内容: 使用inspectdb,我可以从postgres到Django获取一个“间隔”字段。在Django中,它是一个TextField。我检索到的对象确实是一个timedelta对象! 现在,我想将此timedelta对象放入新模型中。最好的方法是什么?因为将timedelta放在TextField中会导致对象的str版本… 问题答案: 您可以以天或秒为单位将时间增量标准化为单个浮点数。 这

  • 问题内容: 如何在div中加入div?我将显示更改为内联,但是浏览器将基本段落分为两个元素,而div将不是该段落的成员。 问题答案: 形成w3网站: P元素表示一个段落。它不能包含 块级元素(包括P本身)。

  • 问题内容: 我在一个新的iOS Swift项目中使用Realm。我将Xcode 6.0.1与iOS SDK 8.0和Realm 0.85.0一起使用 我正在尝试使用新的Realm主键功能,以便可以进行操作。 这是一个示例模型: 以及我如何尝试添加/更新新对象: 我收到此错误: RLMExecption’,原因:“ Foo”没有主键,无法更新 这是主键上的文档。我可能没有正确设置它: http :

  • 我在一个新的iOS Swift项目中使用Realm。我使用Xcode 6.0.1和iOS SDK 8.0和Realm0.85.0 我正在尝试使用新的Realm主键特性,以便可以执行。 下面是一个示例模型: 以下是主键上的文档。我可能没有正确设置: <罢工> http://realm.io/docs/cocoa/0.85.0/api/classes/rlmobject.html#//api/name

  • 我正在学习如何在NodeJs中使用Sequelize来访问MySQL数据库,但是在创建模型的时候,我被外键问题困住了。有谁能建议我如何申请吗?因为我试过一个,但还是出错了。 模型 exam_category.js exam.js 然后在app.js中我写了这样一个: 这是我的database.js。 错误 PS D:PracticeOtpFrontend&>;node.server.js inte

  • 我试图量化一个使用的模型。用替换是不可能的,因为它会严重影响网络性能,甚至毫无用处。 据我所知,在Pytorch中不支持量化。因此,我尝试手动重写这个模块,并使用以绕过此限制。 这就是我到目前为止提出的问题: 对于替换: 基本上,我读取了现有prelu模块的学习参数,并在一个新模块中自己运行计算。该模块似乎在某种意义上工作,它没有失败整个应用程序。 然而,为了评估我的实现是否真的正确并产生与原始模