“通过”与CakePHP 3中的“外键”和“模型”字段关联

“通过”与CakePHP 3中的“外键”和“模型”字段关联,php,mysql,cakephp,associations,cakephp-3.0,Php,Mysql,Cakephp,Associations,Cakephp 3.0,这是一件非常标准的事情,我在CakePHP2中大概做了600次,但就我的一生而言,我无法让它在CakePHP3中工作 我有视频、照片、文章。我也有分类 视频、照片和文章都可以属于一个或多个类别 当前问题的目标是提取属于特定类别的视频 所以,我试过这个: // VideosTable $this->belongsToMany('Categories', [ 'joinTable' => 'categorized', 'className' => 'Categori

这是一件非常标准的事情,我在CakePHP2中大概做了600次,但就我的一生而言,我无法让它在CakePHP3中工作

我有视频、照片、文章。我也有分类

视频、照片和文章都可以属于一个或多个类别

当前问题的目标是提取属于特定类别的视频

所以,我试过这个:

// VideosTable
$this->belongsToMany('Categories', [
    'joinTable' => 'categorized',
    'className' => 'Categorized',
    'foreignKey' => 'foreign_key',
    'conditions' => [
        'Categorized.model' => 'Videos',
    ]
]);

public function getTopVideosByCategory($categorySlug)
{
    return $this->Categories->find('all')
        ->where(['Categories.slug' => $categorySlug])
        ->contain([
            'Videos' => function ($q) {
                return $q
                    ->limit(8)
                    ->contain([
                        'Tags',
                        'Categories' // tried with and without this
                    ])
                    ->order([
                        'Videos.featured' => 'DESC',
                        'Videos.created' => 'DESC'
                    ]);
            }
        ])
        ->first();
}
//VideosTable
public function initialize(array $config)
{
    $this->belongsToMany('Categories', [
        'through' => 'Categorized',
        'conditions' => [
            'Categorized.model' => $this->alias(),
        ]
    ]);
}

public function getTopVideosByCategory($categorySlug)
{
    return $this->find('all')
        ->matching('Categories', function ($q) use ($categorySlug) {
            return $q
                ->where(['Categories.slug' => $categorySlug]);
        })
        ->contain([
            'Tags',
            'Categories'
        ])
        ->limit(8)
        ->order([
            'Videos.featured' => 'DESC',
            'Videos.created' => 'DESC'
            ])
        ->first();
}
错误:SQLSTATE[42S22]:未找到列:1054未知列 “where子句”中的“Categorized.model”

我尝试了许多其他方法,包括创建联接表的模型,以及其他一些方法,但不断出现错误。我尝试了所有的选择,但选择的数量有限。我试过使用一个实际的Table类,也试过类似上面分类的伪类

我不得不假设这是相当标准的,但在书中找不到一个例子,我就是无法让它发挥作用

编辑:

我也试过:

// VideosTable
$this->belongsToMany('Categories', [
    'joinTable' => 'categorized',
    'className' => 'Categorized',
    'foreignKey' => 'foreign_key',
    'conditions' => [
        'Categorized.model' => 'Videos',
    ]
]);

public function getTopVideosByCategory($categorySlug)
{
    return $this->Categories->find('all')
        ->where(['Categories.slug' => $categorySlug])
        ->contain([
            'Videos' => function ($q) {
                return $q
                    ->limit(8)
                    ->contain([
                        'Tags',
                        'Categories' // tried with and without this
                    ])
                    ->order([
                        'Videos.featured' => 'DESC',
                        'Videos.created' => 'DESC'
                    ]);
            }
        ])
        ->first();
}
//VideosTable
public function initialize(array $config)
{
    $this->belongsToMany('Categories', [
        'through' => 'Categorized',
        'conditions' => [
            'Categorized.model' => $this->alias(),
        ]
    ]);
}

public function getTopVideosByCategory($categorySlug)
{
    return $this->find('all')
        ->matching('Categories', function ($q) use ($categorySlug) {
            return $q
                ->where(['Categories.slug' => $categorySlug]);
        })
        ->contain([
            'Tags',
            'Categories'
        ])
        ->limit(8)
        ->order([
            'Videos.featured' => 'DESC',
            'Videos.created' => 'DESC'
            ])
        ->first();
}
但是得到这个错误:

错误:SQLSTATE[42S22]:未找到列:1054未知列 “on子句”中的“Categorized.model”


由于视频和类别不是1-1 o n-1 hasOne或belongsTo,因此不可能构建包含另一个表的条件的SQL表达式。对于这些情况,CakePHP实现匹配函数。它的工作原理与contain类似,但它使用内部联接从外部关联获取数据:

您还可以在此处查看使用它的示例:


由于视频和类别不是1-1 o n-1 hasOne或belongsTo,因此不可能构建包含另一个表的条件的SQL表达式。对于这些情况,CakePHP实现匹配函数。它的工作原理与contain类似,但它使用内部联接从外部关联获取数据:

您还可以在此处查看使用它的示例:


看来你想要的是:

$this->belongsToMany('Categories', [
    'through' => 'Categorized',
    'conditions' => ['Categorized.model' => $this->alias()]
]);

看来你想要的是:

$this->belongsToMany('Categories', [
    'through' => 'Categorized',
    'conditions' => ['Categorized.model' => $this->alias()]
]);

我最终让它像这样工作:

class VideosTable extends Table
{
    public function initialize(array $config)
    {
        $this->hasMany('Categorized', [
            'foreignKey' => 'foreign_key',
            'conditions' => [
                'Categorized.model' => $this->alias(),
            ]
        ]);
    }

    public function getTopVideosByCategory($categorySlug)
    {
        return $this->find()
            ->matching(
                'Categorized.Categories', function ($q) use ($categorySlug) {
                    return $q
                        ->where(['Categories.slug' => $categorySlug]);
            })
            ->limit(8)
            ->order([
                'Videos.featured' => 'DESC',
                'Videos.created' => 'DESC'
                ])
            ->all();
    }
我对José的答案投了赞成票,因为它引导我走上了解决问题的道路,但我会将此标记为答案,因为我认为它可以更快地帮助用户解决这个特定问题


José,如果你想在答案中添加任何你认为合适的调整,我会将标记的答案更改为你的答案。

我最终让它像这样工作:

class VideosTable extends Table
{
    public function initialize(array $config)
    {
        $this->hasMany('Categorized', [
            'foreignKey' => 'foreign_key',
            'conditions' => [
                'Categorized.model' => $this->alias(),
            ]
        ]);
    }

    public function getTopVideosByCategory($categorySlug)
    {
        return $this->find()
            ->matching(
                'Categorized.Categories', function ($q) use ($categorySlug) {
                    return $q
                        ->where(['Categories.slug' => $categorySlug]);
            })
            ->limit(8)
            ->order([
                'Videos.featured' => 'DESC',
                'Videos.created' => 'DESC'
                ])
            ->all();
    }
我对José的答案投了赞成票,因为它引导我走上了解决问题的道路,但我会将此标记为答案,因为我认为它可以更快地帮助用户解决这个特定问题


José,如果您想在答案中添加任何您认为合适的调整,我会将标记的答案更改为您的答案。

分类的表格模式是什么样子的?分类的只是id CHAR 36,外键CHAR 36,型号VARCHAR 60,类别id CHAR 36分类的表格模式是什么样子的?分类的只是id CHAR 36,外键字符36,型号VARCHAR 60,类别id字符36在重新阅读您的问题后,我添加了另一个答案,因为我想我误解了。我不确定哪个答案是新答案,但我无法让这两个答案都起作用。当我尝试使用->匹配时,出现错误:SQLSTATE[42S22]:找不到列:1054未知列“Categorized.model”位于“on子句”中。我是否还需要使用手动->连接选项?书中的例子很好,但看起来不一样,因为它是从我假设的关联模型中提取的。在这种情况下,尽管我说我想使用“分类”作为直通模型,但它说它们没有关联。当我试着在视频上做->where时,它也会抛出错误。我已经更新了我的问题,根据我的最新尝试和建议,并阅读了书中的章节。在重新阅读你的问题后,我又补充了一个答案,因为我想我误解了。我不确定哪一个答案是新的,但我两个答案都不能用。当我尝试使用->匹配时,出现错误:SQLSTATE[42S22]:找不到列:1054未知列“Categorized.model”位于“on子句”中。我是否还需要使用手动->连接选项?书中的例子很好,但看起来不一样,因为它是从我假设的关联模型中提取的。在这种情况下,尽管我说我想使用“分类”作为直通模型,但它说它们没有关联。当我试着在视频上做->where时,它也会抛出错误。我已经更新了我的问题,根据我的最新尝试和建议,并阅读了书中的章节。我还是不能抓住什么东西。