2

我想弄清楚如何为 Laravel Nova Lens 创建查询。我知道底层查询实际上是这里重要的,但我也无法弄清楚。我正在尝试从关系中检索值,这是我的表:

accounts
statements
statement_versions

我想要做的是从statement_versions表中检索一个值,并将其与镜头中的一个帐户相关联。所以,我想balance从我的 中检索statement_versions,并将其与一个帐户相关联。以下是我的关系是如何定义的:

// Accounts

public function statements()
{
    return $this->hasMany(Statement::class);
}

public function statementVersions()
{
    return $this->hasManyThrough(StatementVersion::class, Statement::class);
}

// Statements

public function accounts()
{
    return $this->belongsTo(Account::class);
}

public function statementVersions()
{
    return $this->hasMany(StatementVersion::class);
}

// StatementVersion

public function accounts()
{
    return $this->belongsToThrough(Account::class, Statement::class);
}

public function statements()
{
    return $this->belongsTo(Statement::class);
}

这是我尝试创建的镜头:

public static function query(LensRequest $request, $query)
{
    return $request->withOrdering($request->withFilters(
        $query->select([
                    'statement_version.balance',
                ])
                ->join('statements', 'statement.id', '=', 'statement_version.statement_id')
                ->join('accounts', 'accounts.id', '=', 'statement.account_id')
                ->orderBy('balance', 'desc')
                ->groupBy('accounts.id', 'accounts.name')
    ));
}

这将返回一个错误1066 Not unique table/alias: 'accounts'。我将如何使这个查询和这个镜头工作?

4

1 回答 1

1

我认为问题是您正在lensAccountnova 资源访问它。

在 lens函数$query->getQuery()->toSql()的第一行添加以下内容。如果您从nova 资源访问query,它将打印。URL 看起来像.select * from accountsAccountnova/resources/accounts/lens/[lens-name]

select * from statements如果您从Statementnova 资源访问,它将打印。URL 看起来像nova/resources/statements/lens/[lens-name].

所以取决于你在哪里添加镜头,修改join语句。如果您在StatementVersionnova 资源下添加镜头,当前查询将起作用。

希望它清楚。

于 2018-11-12T09:10:34.907 回答