Как организовать хранение файлов?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как организовать хранение файлов?

Сообщение andku83 »

а вот если бы все-таки Ты(вы) выполнил(и) рекомендации, то мог(ли) бы получить результат:

Код: Выделить всё

class ArticleFile extends ActiveRecord 
{
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getFile()
    {
        return $this->hasOne(File::className(), ['id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getArticle()
    {
        return $this->hasOne(Article::className(), ['id' => 'article_id']);
    }
}

class Article extends ActiveRecord 
{
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getArticleFiles()
    {
        return $this->hasMany(ArticleFile::className(), ['article_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getFiles()
    {
        return $this->hasMany(File::className(), ['id' => 'id'])->viaTable('{{%article_file}}', ['article_id' => 'id']);
    }
}

class File extends ActiveRecord 
{
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getArticleFiles()
    {
        return $this->hasMany(ArticleFile::className(), ['id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getArticles()
    {
        return $this->hasMany(Article::className(), ['id' => 'article_id'])->viaTable('{{%article_file}}', ['id' => 'id']);
    }
}
и мог бы обращаться:

Код: Выделить всё

$article->files; /** File[] */
$file->articles; /** Article[] */

Brainfuck
Сообщения: 281
Зарегистрирован: 2018.02.19, 14:20

Re: Как организовать хранение файлов?

Сообщение Brainfuck »

andku83 писал(а):
2018.09.18, 15:14
а вот если бы все-таки Ты(вы) выполнил(и) рекомендации, то мог(ли) бы получить результат:
Слово пиздец по отношению к этому результату это самое мягкое что я смог подобрать. Я уже объяснял это только что одному человеку, но ты как обычно предпочел не читать тему прежде чем отвечать. Что ж придется процитировать:
Brainfuck писал(а):
2018.09.18, 14:44
Ты понимаешь что само сочетание $articleFile->getFile() звучит как полный абсурд? Это не логично. Из файла получать файл. Тогда надо хотя-бы как-то поиграться с названиями моделей чтобы это выглядело более логично, но я не знаю как по другому это обозвать. Куда логичнее наследоваться.
Это выглядит дико нелогично и неудобно. Использовать этот код я конечно не буду.

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как организовать хранение файлов?

Сообщение andku83 »

Желание понять и разобраться так и брызжет...
Где было предложено обращаться от файла к файлу?!
andku83 писал(а):
2018.09.18, 15:14
и мог бы обращаться:

Код: Выделить всё

$article->files; /** File[] */
$file->articles; /** Article[] */
Выше пример обращения к файлам статьи.
И второй - обращение к статьям к которым относится файл.

з.ы. и если Вам все-таки хочется сделать все "супер" - сделайте, а потом не забудьте нас "зелененьких" научить красоте.

Brainfuck
Сообщения: 281
Зарегистрирован: 2018.02.19, 14:20

Re: Как организовать хранение файлов?

Сообщение Brainfuck »

andku83 писал(а):
2018.09.18, 15:51
з.ы. и если Вам все-таки хочется сделать все "супер" - сделайте, а потом не забудьте нас "зелененьких" научить красоте.
Так я уже сделал. Вот. Учитесь пока я жив! :D

Код: Выделить всё

/**
 * @property int $id
 * @property string $name
 *
 * @property-read ArticleFile[] $files
 */
class Article extends ActiveRecord {
    public static function tableName() {
        return 'articles';
    }

    public function getFiles() {
        return $this
            ->hasMany(ArticleFile::class, ['id' => 'article_id'])
            ->viaTable('article_files', ['file_id' => 'id'])
            ->inverseOf('article');
    }
}

/**
 * @property int $id
 * @property string $path
 */
class FileBase extends ActiveRecord {
    public static function tableName() {
        return 'files';
    }
}

/**
 * @property int $file_id
 * @property int $article_id
 *
 * @property-read Article $article
 */
class ArticleFile extends FileBase {
    public function getArticle() {
        return $this
            ->hasOne(Article::class, ['id' => 'article_id'])
            ->viaTable('article_files', ['file_id' => 'id']);
    }
}

Код: Выделить всё

$article = Article::findOne(1);
$file = ArticleFile::findOne(1);

echo JSON::encode([
	'article' => $article->attributes,
	'article.files' => ArrayHelper::getColumn($article->files, 'attributes'),
	'file' => $file->attributes,
	'file.article' => $file->article->attributes
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

Код: Выделить всё

{
    "article": {
        "id": 1,
        "name": "test"
    },
    "article.files": [
        {
            "id": 1,
            "path": "path"
        }
    ],
    "file": {
        "id": 1,
        "path": "path"
    },
    "file.article": {
        "id": 1,
        "name": "test"
    }
}
Только что проверил. Все работает. На этом вопрос закрыт!

Закрыто