Отношения Phalcon многие ко многим, не могут правильно запрос - PullRequest
0 голосов
/ 02 марта 2019

Я новичок в PHP и MySQL.Я создаю свою собственную аниме CMS на платформе Cphalcon, но у меня есть некоторые проблемы с отношениями многие ко многим, и я не могу правильно запросить.

У меня есть 3 таблицы на MariaDB:

Аниме:

id
title
slug
cover

Сезоны:

id
name
animeId

Эпизоды:

id
animeId
seasonsId
name
cover

И 3 модели из phalcon:

Аниме:

<?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 %}

На самом деле код работает, но он возвращает только эпизоды в первом сезоне, а не для каждого сезона

Пример из БД:

Аниме:

 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?

1 Ответ

0 голосов
/ 26 марта 2019

если вы спрашиваете, как сделать отношения многих ко многим

Аниме:

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

Сезоны:

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