1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Laravel HasImages Trait

  • PixelPatron
  • 17. März 2025 um 12:28
  • Unerledigt
  • PixelPatron
    20
    PixelPatron
    github.com/pixelpatron90
    Reaktionen
    164
    Punkte
    4.059
    Beiträge
    720
    Einträge
    3
    • 17. März 2025 um 12:28
    • #1

    Hey, ich Sitze gerade daran meine Models so auf bzw umzuschreiben das ich mehr mit Traits arbeiten kann zB HasCategories oder HasTags. In diesem Zuge macht es für mich Sinn das ganze auch mit HasImages so zu machen. Images haben zB die Produkte oder die Artikel. Von Prinzip her klappt der Upload schon allerdings wird es nicht in die Datenbank eingetragen. Die Frage die ich mir stelle:

    Macht es Sinn alle hochgeladenen Bilder auch in der DB festzuhalten und welche Daten sollten das genau sein?

    Ich hoffe jemand (lach) kann mir eventuell sein HasImages Trait mal zeigen oder mir ein paar Tipps geben wo es genau hakt.

    Liebe Grüsse und einen schönen Montag

    pixelpatron-100000?style=for-the-badge&logo=X&logoColor=white&labelColor=000000&color=FF0000 pixel_patron-100000?style=for-the-badge&logo=Discord&logoColor=white&labelColor=000000&color=FF0000 pixelpatron90-100000?style=for-the-badge&logo=GitHub&logoColor=white&labelColor=black&color=FF0000

    https://evarioo.eu/

  • Online
    Syntafin
    27
    Syntafin
    LISTstack Dev
    Reaktionen
    498
    Punkte
    7.773
    Trophäen
    2
    Beiträge
    1.412
    • 17. März 2025 um 15:02
    • #2
    Zitat von PixelPatron

    Macht es Sinn alle hochgeladenen Bilder auch in der DB festzuhalten

    Metadaten ja, damit man auch weiß welche Datei es ist.

    Zitat von PixelPatron

    und welche Daten sollten das genau sein?

    Dateiname, Original Dateiname (falls man das möchte), Dateiendung, Größe, Model, Model ID.

    Zitat von PixelPatron

    Ich hoffe jemand (lach) kann mir eventuell sein HasImages Trait mal zeigen

    Ist ja kein Geheimnis wie das aussieht:

    PHP: HasImage.php
    <?php
    
    namespace App\Traits;
    
    use Illuminate\Support\Facades\Storage;
    
    trait HasImage
    {
        public function getFolderUrlAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/folder/'.$this->files()->first()->filename.'.webp')
                : $this->defaultImage();
        }
    
        public function getPreviewUrlAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/large/'.$this->files()->first()->filename.'.webp')
                : $this->defaultImage();
        }
    
        public function getImageUrlAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/show/'.$this->files()->first()->filename.'.webp')
                : $this->defaultImage();
        }
    
        public function getImageContactAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/contact/'.$this->files()->first()->filename.'.webp')
                : $this->defaultImage();
        }
    
        protected function defaultImage(): string
        {
            return Storage::disk('public')->url('default.webp');
        }
    }
                                                                                                                                                                                                }
    Alles anzeigen
    Zitat von PixelPatron

    Tipps geben wo es genau hakt.

    Dafür müsste man das Problem erstmal kennen.

    Zitat von PixelPatron

    Von Prinzip her klappt der Upload schon allerdings wird es nicht in die Datenbank eingetragen.

    Am Upload ändert sich ja nichts, aber wie versuchst du es denn einzutragen?

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

    2 Mal editiert, zuletzt von Syntafin (17. März 2025 um 19:03)

  • PixelPatron
    20
    PixelPatron
    github.com/pixelpatron90
    Reaktionen
    164
    Punkte
    4.059
    Beiträge
    720
    Einträge
    3
    • 17. März 2025 um 18:26
    • #3
    Zitat von Syntafin

    Dateiname, Original Dateiname (falls man das möchte), Dateiendung, Größe, Model, Model ID.

    Okay kann deinen Trait soweit nachvollziehen. Was ich nicht finde ist wo du die besagten Meta Daten Speicherstadt bzw. wie? Ich schätze das Model heißt File? :)

    Und als relation files() quasi

    Code
    $this->hasOne(File::class);

    pixelpatron-100000?style=for-the-badge&logo=X&logoColor=white&labelColor=000000&color=FF0000 pixel_patron-100000?style=for-the-badge&logo=Discord&logoColor=white&labelColor=000000&color=FF0000 pixelpatron90-100000?style=for-the-badge&logo=GitHub&logoColor=white&labelColor=black&color=FF0000

    https://evarioo.eu/

  • Online
    Syntafin
    27
    Syntafin
    LISTstack Dev
    Reaktionen
    498
    Punkte
    7.773
    Trophäen
    2
    Beiträge
    1.412
    • 17. März 2025 um 19:03
    • #4
    Zitat von PixelPatron

    as ich nicht finde ist wo du die besagten Meta Daten Speicherstadt bzw. wie?

    JSON
    [
      {
        "id": 1,
        "filename": "1MPNaYV4MzyLjJ4vnnQgTlcCBTPuDDxZXeEwM7k4",
        "extension": "jpg",
        "mime": "0",
        "filesize": 1760742,
        "width": 1829,
        "height": 2560,
        "user_id": 1,
        "image_id": 1,
        "created_at": "2025-03-14 21:16:37",
        "updated_at": "2025-03-14 21:16:37",
        "deleted_at": null
      }
    ]
    Alles anzeigen

    Korrekt, hab das Model einfach File genannt.

    Zitat von PixelPatron

    Und als relation files() quasi

    PHP
    public function files(): HasMany
    {
        return $this->hasMany(File::class);
    }

    Bei mir ist es eine HasMandy Relation, da mehrere Dateien einem Model zugewiesen werden können.

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

  • PixelPatron
    20
    PixelPatron
    github.com/pixelpatron90
    Reaktionen
    164
    Punkte
    4.059
    Beiträge
    720
    Einträge
    3
    • 17. März 2025 um 19:13
    • #5

    Was ich meinte in dem Trait finde ich nur das der filename und Endung gespeichert werden. Wo deklarierst du den Rest oder bin ich einfach grad nur blind?

    Macht es Sinn in den Trait upload Funktion zu bauen die ich quasi nutze um images hoch zuladen?

    pixelpatron-100000?style=for-the-badge&logo=X&logoColor=white&labelColor=000000&color=FF0000 pixel_patron-100000?style=for-the-badge&logo=Discord&logoColor=white&labelColor=000000&color=FF0000 pixelpatron90-100000?style=for-the-badge&logo=GitHub&logoColor=white&labelColor=black&color=FF0000

    https://evarioo.eu/

    Einmal editiert, zuletzt von PixelPatron (17. März 2025 um 19:19)

  • Online
    Syntafin
    27
    Syntafin
    LISTstack Dev
    Reaktionen
    498
    Punkte
    7.773
    Trophäen
    2
    Beiträge
    1.412
    • 17. März 2025 um 19:32
    • #6

    Der Trait baut bei mir nur die URLs, erfüllt also aktuell sonst keine Funktion.

    Wenn der Upload bei dir an mehreren Stellen erfolgt, macht es schon Sinn das ganze in einen Trait oder Service auszulagern.

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

  • PixelPatron
    20
    PixelPatron
    github.com/pixelpatron90
    Reaktionen
    164
    Punkte
    4.059
    Beiträge
    720
    Einträge
    3
    • 17. März 2025 um 19:56
    • #7

    Okay ich verstehe. Eine wichtige Frage habe ich aber noch: Hast du generell deine Models so aufgebaut das du Downloads anbieten könntest? Sprich: Der Image Upload .. -> file Model hast du da für Images eine Tabelle und zb eine für Files wie pdfs?

    Nachtrag:

    HasImages
    PHP
    <?php
    
    namespace App\Filament\Resources\Traits;
    
    use Filament\Forms\Components\FileUpload;
    use Illuminate\Support\Facades\Storage;
    
    trait HasImages
    {
        public function getFolderUrlAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/folder/' . $this->files()->first()->filename . '.webp')
                : $this->defaultImage();
        }
    
        public function getPreviewUrlAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/large/' . $this->files()->first()->filename . '.webp')
                : $this->defaultImage();
        }
    
        public function getImageUrlAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/show/' . $this->files()->first()->filename . '.webp')
                : $this->defaultImage();
        }
    
        public function getImageContactAttribute(): string
        {
            return $this->files()->exists()
                ? Storage::url('public/files/contact/' . $this->files()->first()->filename . '.webp')
                : $this->defaultImage();
        }
    
        protected function defaultImage(): string
        {
            return Storage::disk('public')->url('default.webp');
        }
    
        public static function formImagesField(): FileUpload
        {
            return
                FileUpload::make('images')
                    ->label('Upload Images')
                    ->helperText('Upload multiple images')
                    ->multiple()
                    ->disk('public')
                    ->directory(fn(\Filament\Forms\Get $get, $record) => strtolower(class_basename($record)) . '/' . $get('id') . '/images/')
                    //->acceptedFileTypes(['image/*'])
                    //->maxSize(10240)
                    ->storeFilenamesIn('original_name')
                    ->visibility('public')
                    ->previewable(false)
                    ->reactive()
                    ->columnSpan('full')
                    ->saveRelationshipsUsing(function ($component, $state, $record) {
                        foreach ($state as $filePath) {
                            $record->files()->create([
                                'path' => $filePath,
                                'model' => get_class($record),
                                'original_name' => 'aasd',
                            ]);
                        }
                    });
        }
    
    }
    Alles anzeigen
    Article Model
    Code
    public function files(): HasMany
        {
            return $this->hasMany(File::class);
        }

    Bin total lost: Als Fehler bekomme ich beim Uploaden:

    SQLSTATE[HY000]: General error: 1 table files has no column named article_id (Connection: sqlite, SQL: insert into "files" ("path", "article_id", "updated_at", "created_at") values (article/1/images//01JPJVHQYRYPKFP8S40VYJ5D1N.jpg, 1, 2025-03-17 21:08:31, 2025-03-17 21:08:31))

    Wobei ich nicht will das da article_id steht oder geht das nicht anderster?

    pixelpatron-100000?style=for-the-badge&logo=X&logoColor=white&labelColor=000000&color=FF0000 pixel_patron-100000?style=for-the-badge&logo=Discord&logoColor=white&labelColor=000000&color=FF0000 pixelpatron90-100000?style=for-the-badge&logo=GitHub&logoColor=white&labelColor=black&color=FF0000

    https://evarioo.eu/

    2 Mal editiert, zuletzt von PixelPatron (17. März 2025 um 21:09)

  • Online
    Syntafin
    27
    Syntafin
    LISTstack Dev
    Reaktionen
    498
    Punkte
    7.773
    Trophäen
    2
    Beiträge
    1.412
    • 17. März 2025 um 22:14
    • #8

    Downloads laufen bei mir über temporäre URLs, da die ja entweder außerhalb des öffentlichen Bereiches liegen die original Dateien, oder eben auf Object Storages wie Amazon S3, Cloudflaute R2 etc.

    Das JSON da oben ist vom File Model, mehr Daten speichere ich darin nicht ab, die Dateien sind aber ausschließlich für das Image Model, weshalb ich keine Angabe zum model speichere.

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Tags

  • laravel
  • trait
  • images

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung