【问题标题】:Nette Database: No reference found for Join queryNette 数据库:未找到联接查询的参考
【发布时间】:2021-02-26 17:45:37
【问题描述】:

如何使用 JOINS 在 renderDefault 函数中创建查询?我已经看了一段时间的 nette 文档,但似乎找不到我的答案。所以想请教有经验的人。谁能知道答案?

** 假设您收到了这个查询**

SELECT a.id, a.firstname, a.lastname, b.name FROM racers a JOIN types b ON b.id = a.type

你想这样创建它:

public function renderDefault(): void
{
$this->template->racers = $this->database->table('racers');
}

我的一个想法是做这样的事情

public function renderDefault(): void
{
$this->template->racers = $this->database->table('racers')
->select('racers.id, racers.firstname, racers.lastname, types.name')
->joinWhere('types', 'types.id = racers.type');
}

由于某种原因,“我的”查询似乎有效,直到我需要在拿铁咖啡的 foreach 循环中使用它。 这就是为什么我想知道有什么更好的方法来做到这一点。

{foreach $racers as $racer}
<tr>
  <th scope="row">{$racer->id}</th>
  <td>{$racer->firstname}</td>
  <td>{$racer->lastname}</td>
  <td>{$racer->name}</td>
</tr>
{/foreach}

错误:

Nette\InvalidArgumentException 
No reference found for $racers->types.

【问题讨论】:

    标签: php orm nette


    【解决方案1】:

    如果您想通过core API 使用更简单的database explorer API 而不是常规SQL 查询,则需要在数据库中正确设置外键。

    资源管理器 API 将允许您直接使用表,推断要选择哪些列以及要自动使用哪些表:

    public function renderDefault(): void {
        $this->template->racers = $this->database->table('racers');
    }
    
    <tr n:foreach="$racers as $racer">
      <th scope="row">{$racer->id}</th>
      <td>{$racer->firstname}</td>
      <td>{$racer->lastname}</td>
      <td>{$racer->type->name}</td>
    </tr>
    

    【讨论】:

      猜你喜欢
      • 2020-10-24
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多