【问题标题】:Phalcon relationships many to many, cannot query properlyPhalcon 关系多对多,无法正确查询
【发布时间】:2019-07-24 05:18:56
【问题描述】:

我是 PHP 和 MySQL 的新手。我正在 Cphalcon 框架上构建自己的动漫 CMS,但在多对多关系方面存在一些问题,无法正确查询。

我在 MariaDB 上有 3 个表:

动漫:

id
title
slug
cover

季节:

id
name
animeId

剧集:

id
animeId
seasonsId
name
cover

还有来自 phalcon 的 3 个模型:

动漫:

<?php
namespace LearnPhalcon\Models;

use Phalcon\Mvc\Model;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;


class Anime extends Model
{

  public $id;

  public $title;

  public function initialize()
  {
    $this->hasMany('id', __NAMESPACE__ . '\Seasons', 'animeId', [
        'alias' => 'seasons'
    ]);
    $this->hasMany('id', __NAMESPACE__ . '\Episodes', 'animeId', [
        'alias' => 'episodes'
    ]);
  }

}

季节:

<?php
namespace LearnPhalcon\Models;

use Phalcon\Mvc\Model;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;



class Seasons extends Model
{
  public $id;

  public $name;

  public function initialize()
  {
    $this->belongsTo('id', __NAMESPACE__ . '\Anime', 'id', [
        'alias' => 'anime'
    ]);
    $this->hasMany('id', __NAMESPACE__ . '\Episodes', 'seasonsId', [
        'alias' => 'episodes'
    ]);
  }

}

剧集:

<?php
namespace LearnPhalcon\Models;

use Phalcon\Mvc\Model;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;


class Episodes extends Model
{
  public $id;

  public $name;


  public function initialize()
  {
    $this->belongsTo('id', __NAMESPACE__ . '\Anime', 'id', [
        'alias' => 'anime'
    ]);
    $this->belongsTo('id', __NAMESPACE__ . '\Seasons', 'id', [
        'alias' => 'seasons'
    ]);
  }

}

此处索引控制器内的操作:

public function aniAction($slug)
    {
      $slug = $this->dispatcher->getParam('slug');
      $ani = Anime::findFirst(array(
      'slug = :slug:',
      'bind' => array(
      'slug' => $slug
      )));


      if ($ani === false) {
       $this->dispatcher->forward(array(
         'controller' => 'Error',
         'action' => 'ops'
        ));
      }

     $this->view->setVar('ani', $ani);
     $this->view->setTemplateBefore('public');
    }

还有观点:

  {% for seasons in ani.seasons %}
    {{ seasons.name }}
    <br/>
    {% for episodes in seasons.episodes %}
      {{ episodes.name }}
      <br/>
    {% endfor %}
  {% endfor %}

实际上代码可以工作,但是 它只返回第一季的剧集,而不是每一季

来自 db 的示例:

动漫:

 ID: 1
 Title: Test Anime
 Slug: test-anime
 Cover: /var/uploads/test.png

季节:

--------------------
     ID: 1
     Name: Season 1
     animeId: 1
--------------------
     ID: 2
     Name: Season 2
     animeId: 1
--------------------

剧集:

--------------------
ID: 1
animeId: 1
seasonsId: 1
name: Test Name
cover: n/d
---------------------
ID: 2
animeId: 1
seasonsId: 1
name: Test Name2
cover: n/d
---------------------
ID: 3
animeId: 1
seasonsId: 2
name: Test Name3
cover: n/d
---------------------

从我在 HTML 中得到的实际测试操作:

Season 1
Test Name
Test Name2
Season 2 
(and here nothing)
should be Test Name3?

【问题讨论】:

  • 代码看起来不错,并且可以正常工作。我会仔细查看数据 - 仔细检查 Test Name3 是否确实与第 2 季相关。

标签: php database many-to-many phalcon


【解决方案1】:

如果你问如何建立多对多关系

动漫:

$this->hasManyToMany('id',__NAMESPACE__ . '\Episodes','animeId','seasonsId',__NAMESPACE__ . '\Seasons','id',['alias'=>'Seasons']);

季节:

$this->hasManyToMany('id',__NAMESPACE__ . '\Episodes','seasonsId','animeId',__NAMESPACE__ . '\Anime','id',['alias'=>'Anime']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-10-03
    • 2018-11-02
    • 2015-10-26
    • 2011-08-08
    • 2015-05-29
    • 2019-10-28
    相关资源
    最近更新 更多