На Silverstripe, как мне получить DataList объектов внуков, включая их дополнительные поля? - PullRequest
1 голос
/ 18 февраля 2020

У меня есть установка, аналогичная описанной ниже.

class A extends DataObject{
    private static $many_many = array(
        'Bs' => 'B'
    );

    public function Grandchildren(){
        // return grandchildren, including their many_many_extraFields data (ExtraData)
    }
}

class B extends DataObject{
    private static $many_many = array(
        'Cs' => 'C'
    );

    private static $belongs_many_many = array(
        'As' => 'A'
    );

    private static $many_many_extraFields = array(
        'As' => array(
            'ExtraData' => 'Int'
        )
    );
}

class C extends DataObject{
    private static $db = array(
        'Name' => Varchar(255)
    );

    private static $belongs_many_many = array(
        'Bs' => 'B'
    );
}

I wi sh для извлечения всех C объектов всех B объекты из функции на A (здесь она называется Grandchildren () ).

Два потенциальных решения, которые я не могу заставить работать:

1 -

public function Grandchildren(){
    $grandchildren = DataList::create();
    foreach($this->Bs() as $b){
        $Cs = $b->Cs();
        // How would I then merge these into one single DataList ($grandchildren)?
    }
    return $grandchildren;
}

2 -

public function Grandchildren(){
    return C::get()->leftJoin('B_Cs', 'B_Cs.CID = C.ID')->where('B_Cs.AID = ' . $this->ID);
    // This works but doesn't contain the needed ExtraData.
}

Заранее большое спасибо за любую помощь.

1 Ответ

1 голос
/ 18 февраля 2020

Ах, прости. Ответ был намного проще, чем я думал. Просто снова рассмотрел каждый метод в документах для DataList.

public function Grandchildren(){
    return $this->Bs()->relation('Cs');
}

Оставив здесь вопрос и ответ, чтобы помочь любому из тех, кто застрял в той же ситуации, что и я (поскольку я застрял с этой проблемой, многие раз до).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...