【问题标题】:Problem with many_many relationship with Silverstripe Fluent与 Silverstripe Fluent 的 many_many 关系存在问题
【发布时间】:2019-10-24 02:42:39
【问题描述】:

我们正在开发一个 Silverstripe 项目,使用 Fluent 来显示多个翻译/语言环境。

我们想要设置一些数据对象,以便可以将记录切换为仅在某些 Fluent 语言环境中显示。想法是在数据对象上有一个复选框字段,用户可以在其中选择他们希望记录显示的区域设置。

这是一个示例数据对象:

namespace Yard;

use SilverStripe\ORM\DataObject;
use TractorCow\Fluent\Model\Locale;

class Milkshake extends DataObject {
  private static $table_name = 'Milkshake';

  private static $db = [
    'Title' => 'Varchar(255)'
  ]

  private static $belongs_many_many = [
    'ShowInLocale' => 'Locale'
  ];
}

那么我们需要扩展 Locale 类:

namespace AppExtensions;

use SilverStripe\ORM\DataExtension;

class LocaleExtension extends DataExtension
{
    private static $many_many = [
        'Milkshakes' => 'Yard\Milkshake'
    ];
}

并通过 YML 应用该扩展:

TractorCow\Fluent\Model\Locale:
  extensions:
    - 'AppExtensions\LocaleExtension'

到目前为止一切顺利 - 但是当我尝试在管理员中查看“奶昔”时,我收到以下错误消息:

[紧急] 未捕获的 LogicException:belongs_many_many 关系 Yard\Milkshake.ShowInLocale 指向没有匹配的 Locale 很多人

据我所知,我添加了一个匹配的many_many 关系:数据库记录已创建。

感谢任何关于我应该如何解决此问题的想法。

【问题讨论】:

    标签: php silverstripe silverstripe-4


    【解决方案1】:

    我使用$many_many through functionality 通过单独的数据对象建立连接。

    Milkshake 对象从 $belongs_many_many(不正确)更改为 $many_many,具有“通过”对象关系:

    class Milkshake extends DataObject {
    
      private static $many_many = [
        'ShowInLocale' => [
          'through' => LocaleMilkshake::class,
          'from' => 'Milkshake',
          'to' => 'Locale'
         ]
      ];
    

    这就是我创建复选框的方式:

    $fields = parent::getCMSFields();
    $showInLocaleField = CheckboxSetField::create(
      'ShowInLocale',
      'Show in these Locales',
       Locale::get()->map('ID','Title');
     );
     $fields->addFieldToTab('Root.Main', $showInLocaleField);
    

    并定义了一个单独的数据对象:

    class LocaleMilkshake extends DataObject
    {
      private static $table_name = 'LocaleMilkshake';
      private static $has_one = [
        'Milkshake' => 'Yard\Milkshake',
        'Locale' => 'TractorCow\Fluent\Model\Locale'
      ];
    }
    

    并将Locale关系更改为$belongs_many_many

    class LocaleExtension extends DataExtension
    {
        private static $belongs_many_many = [
            'Milkshakes' => 'Yard\Milkshake'
        ];
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多