当前位置: 首页 > 知识库问答 >
问题:

Laravel与非默认的本地密钥有ManyBy关系

慕凌
2023-03-14

我的模式如下:

客户(拥有多个账户)

  • id
  • 名字

账户(持有大量资产,属于客户)

  • id(int)

控股(财产至账户)

  • id

所以,客户有很多账户有很多控股。需要注意的是,帐户的本地密钥是account_id,而不仅仅是预期的id。这是因为要求帐户具有字符串标识符。在持有量表中,外键也是account_id

我已经这样定义了我的关系:

// Client.php
public function accounts()
{
    return $this->hasMany('Account');
}

// Account.php
public function client()
{
    return $this->belongsTo('Client');
}
public function holdings()
{
    return $this->hasMany('Holding');
}

// Holding.php
public function account()
{
    return $this->belongsTo('Account', 'account_id', 'account_id');
}

如果我想查询一个给定客户ID的所有持有量,我会怎么做?如果我做了类似的事情

Client::find($id)->accounts->holdings;

我得到这个错误:

未定义的属性:Illumb\Database\Eloquent\Relations\HasMany::$holdings

我还尝试使用hasManyBy关系(将关系添加到我的模型中),但似乎只有一种方法可以定义外键,而不是帐户的本地键。有什么建议吗?

共有3个答案

郎鸿朗
2023-03-14

我认为您可以使用load方法为每个帐户获得相应的查询结果。比如:

Client::find($id)->load('accounts.holdings');

这意味着客户id存在于账户中并且持有的也有账户id

附言:我不太确定在这种情况下这将如何工作。但我希望这能引导你找到做这件事的方法。

姚洲
2023-03-14

您需要更改帐户模型中的关系

// Account.php
public function client()
{
   return $this->belongsTo('Client','account_id');
}

但是,更合适的做法是将client_id表中的列名更改为

姜明贤
2023-03-14

假设您在accounts表上有客户id

这样做:

// Account model
public function holdings()
{  
  return $this->hasMany('Holding', 'account_id', 'account_id');
}

// then

$client = Client::with('accounts.holdings')->find($id);
$client->accounts // collection
          ->first() // or process the collecction in the loop
          ->holdings; // holdlings collection

只有当帐户模型有(或将要为此目的有)$初级密钥设置为account_id而不是默认的id时,HasManyPass才会工作

因为account_id不是帐户模型的主键,所以不能使用hasManyBy。所以我建议你这样做:

$accountIds = $client->accounts()->lists('account_id');

//  if it was many-to-many you would need select clause as well:
//  $accountIds = $client->accounts()->select('accounts.account_id')->lists('account_id');

$holdings = Holding::whereIn('account_id', $accountIds)->get();

通过这种方式,您可以像您所希望的那样获得集合,与即时加载相比,donwside还需要1个查询。

 类似资料:
  • 问题内容: 我遇到以下错误,并且有点卡住:线程“ main”中的异常 我被困住了,因为我找到的所有答案都涉及通常包含在android SDK中的Java 密码扩展(JCE) 。所以我认为我的问题不是这个。 我一定忘记了一些东西,但是我找不到。也许我的代码是错误的(这是我使用Java进行加密的第一种方法,我不是专家,下面的代码大部分是教程的复制粘贴)。 我使用以下代码对String进行加密和解密:

  • 问题内容: 我之前曾问过一个问题,但是没有得到正确的回答,也无济于事。 因此,我澄清了有关该问题的一些细节,我真的很想听听你关于如何解决此问题或应该尝试的想法。 我在Linux服务器上安装了Java 1.6.0.12,下面的代码运行得很完美。 今天,我在服务器用户上安装了Java 1.6.0.26,当我尝试运行应用程序时,出现以下异常。我的猜测是它与Java安装配置有关,因为它在第一个版本中有效,

  • 我使用mysql aes加密和解密如下: 我读到AES支持128 192和256。我假设默认值是128是正确的吗?因此,鉴于上述查询没有定义密钥长度,它会以默认密钥长度加密和解密吗? 如果是这样,在上面的查询中指定密钥长度会更好吗?因为例如:假设我使用默认值128加密和存储数据,但后来设置更改,256变为默认值,那么这意味着它将无法解密数据,对吗?有没有办法在上面的查询中定义密钥长度? 另外,我用

  • 我正在为RESTAPI建立一个Laravel项目。基本上,我将用户分为两个表,用户和管理员(模型名)。我想使用默认的Laravel身份验证框架通过web guard对管理员进行身份验证,并使用JWT(tymondesigns提供的包)通过api guard对用户进行身份验证。一切都很顺利。我配置了软件包,在app/auth.php中设置了防护和提供者,并使其几乎正常工作。 我现在可以通过Auth

  • 密码\u默认值和密码\u BCRYPT之间有什么区别?他们都使用河豚加密算法吗?算法的成本是多少?如何在PHP中设置密码\u散列生成255个散列长度而不是60个?

  • 我正在尝试加密laravel默认加密中的json编码字符串。但我不确定它使用的是AES-256-CBC。这背后的原因是,我还在尝试从AES自定义类进行相同的加密。 我所做的。 > json_编码数组 在AES自定义类中设置密钥、模式和块大小并生成令牌。 加密令牌。 使用setData设置加密令牌 使用AES自定义类解密 结果与我在步骤1中的结果相同。当我尝试加密(Crypt::encrypt($R