几家公司参与投标,每家投标数次。然后在投标中确定中标。
任务:查找特定公司中标的所有标书。
招标 投标:id,bet_winner_id(链接到中标)
投注 : , (链接到投标), id(链接到公司)tender_idcompany_id
公司 :_id
class Tender extends Model
{
/**
* Все ставки
* @return HasMany
*/
public function bets()
{
return $this->hasMany(Bet::class, "tender_id", "id");
}
/**
* Выигранная ставка
* @return HasOne
*/
public function winBet()
{
return $this->hasOne(Bet::class, "id", "bet_winner_id");
}
}
class Bet extends Model
{
/**
* Тендер
* @return HasOne
*/
public function tender()
{
return $this->hasOne(Tender::class, "id", "tender_id");
}
/**
* Компания
* @return HasOne
*/
public function company()
{
return $this->hasOne(Company::class, "id", "company_id");
}
}
class Company extends Model
{
/**
* Ставки
* @return HasMany
*/
public function bets()
{
return $this->hasMany(Bet::class, "company_id", "id");
}
}
我创建了一个这样的方法:
class Tender extends Model
{
/**
* Тендеры, в которых ставила компания
* @param Builder $query
* @param int $companyId
* @param bool|null $isWin только выигрыш
* @return Builder
*/
public function scopeCompanyTakePartTenders(Builder $query, int $companyId, ?bool $isWin = null)
{
return $query->whereHas("bets", function ($q) use ($companyId, $isWin) {
$q->where("company_id", "=", $companyId);
$q->whereHas("tender", function ($q) use ($companyId, $isWin) {
$q->where("tender.bet_winner_id", "=", "bet.id");
});
});
}
}
但是,它不起作用,它count()返回零,尽管根据数据应该有一个明确的单位:
$id = $company->getKey();
$query = Tender::companyTakePartTenders($id)->toSql();
$cnt = Tender::companyTakePartTenders($id)->count(); // <---
dump("$id: $cnt");
dump($query);
查询是这样转储的:
select * from "tender" where exists
(select * from "bet" where "tender"."id" = "bet"."tender_id" and "company_id" = ? and exists
(select * from "tender" where "bet"."tender_id" = "tender"."id" and "tender"."bet_winner_id" = ?
and "tender"."deleted_at" is null
)
) and "tender"."deleted_at" is null
我不明白为什么这段代码:
$q->where("tender.bet_winner_id", "=", "bet.id");
生成以下查询:
"tender"."bet_winner_id" = ?
如何正确编写代码?
因为构建器解析传入的值。要更正它,请使用该方法