在 Laravel 5.1 中,使用 hasManyThrough 关系的模型需要不同的数据库连接。

9
我正在尝试使用Laravel 5.1中的hasManyThrough关系,但是SQL查询未使用为每个模型定义的连接的适当前缀。我有3个模型,其中2个使用相同的连接,而另一个使用不同的连接。 连接之间唯一的区别是前缀,而数据库相同。
  • Model A具有连接A,该连接使用前缀A_
  • Model B具有连接B,该连接使用前缀B_
  • Model C具有连接B,该连接使用前缀B_

关系:

在Model B内:

public function relationshipWithA()
{
    return $this->hasManyThrough(A::class, C::class, 'Cid', 'Aid');
}

最终的查询逻辑是正确的,但是在连接表时,它使用了 A_ 前缀代替 B_ 前缀。这是 Laravel 的一个 bug/限制吗?有没有解决办法,或者我必须手动连接才能实现想要的功能?

Laravel模型无法与不同的关联连接一起使用,因为Eloquent在幕后使用SQL连接,而这在多个数据库连接时是不可能的。 - AfikDeri
2个回答

5

其他关系类型可以使用多个数据库连接:

public function foos()
{
    return $this->belongsToMany(Foo::class, 'other_db.foos');
}

但是,hasManyThrough在其签名中没有$table参数,因此相同的解决方案不适用。 然而, 您可以使用以下不完美的解决方法:
public function bars()
{
    return $this->belongsToMany(Bar::class, 'other_db.bars');
}

public function foos()
{
    $barIds = $this->bars->pluck('id');
    return Foo::whereIn('bar_id', $barIds);
}

虽然由于不同的返回类型,它不能提供完全相同的功能,但对于更简单的事情,它可以达到目的。

如果你想要,你也可以通过这样的方式复制一些更多的语法:

protected $appends = [
    'foos',
];

/**
 * @return Foo[]
 */
public function getFoosAttribute()
{
    return $this->foos()->get();
}

这样,您仍然可以像使用常规关系一样在代码中使用它(这意味着您可以使用$this->foos而不是$this->foos()->get())。


-1

实际上,如果您通过$connection属性在模型类中指定连接,它似乎可以正常工作。我在Laravel 5.5中使用morphMany关系在MySQL和SQL连接之间进行了测试:

账户模型:

class Account extends Model
{
    protected $connection = 'sqlsrv';

    public function notifications()
    {
        return $this->morphMany(Notification::class, 'notifiable');
    }
}

通知模型:
class Notification extends Model
{
    protected $connection = 'mysql';

    public function notifiable()
    {
        return $this->morphTo();
    }
}

2
它可能适用于morphMany,但这个问题是关于hasManyThrough,而该方法不起作用。 - Joel Mellon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接