• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

laravel problem z relacjami w tabelach

VPS Starter Arubacloud
0 głosów
95 wizyt
pytanie zadane 22 września 2020 w PHP przez nowyklemens Początkujący (430 p.)

witam. 
mam tabele users i posts. Mam zrobione relacje i poprzez phpmyadmin normalnie moge dodawac rekordy i przypisywac posty do uzytkownikow.
Za żadne skarby nie umiem jednak ustawic przy tworzeniu nowego posta przez uzytkownika, żeby 
mi dodawało do bazy autora posta. Cały czas mam nullable. Przerabiam ten kod juz od wczoraj na rozne sposoby, ale jestem za glupi najwyrazniej. Domyslam sie, ze w "store" mam lipe... moglby mi ktos wskazac rozwiazanie?

    public function store(PostsRequest $request)
    {
        Posts::create($request->all());
        return redirect()->route('posts.index');
    }
@extends('layout')

@section('content')

   <form action="{{ route('posts.store') }}" method="post">
   @csrf

    @if ($errors->any())
            @foreach ($errors->all() as $error)
                <div class="btn btn-danger">{{ $error }}</div>
            @endforeach
    @endif

    <div class="form-group">
        <label for="title">Tytuł posta:</label>
        <input type="text" name="title" class="form-control">
    </div>

    <div class="form-group">
         <label for="content">Treść posta:</label>
        <textarea rows="7" name="content" class="form-control"></textarea>
    </div>

    <div class="form-group">
       <button type="submit" value="Zapisz" class="btn btn-primary">Dodaj post</button>
       <span class="btn btn-dark">
		<a href="javascript:history.back()" >Powrót</a>
		</span>
    </div>

    </form>

@endsection
public function up()
    {
         Schema::create('posts', function (Blueprint $table) {
            $table->BigIncrements('id');
            $table->string('title');
            $table->string('content');
            $table->BigInteger('user_id')->unsigned()->nullable();
            $table->timestamps();
      
				$table->foreign('user_id')
				->references('id')
				->on('users')
				->onDelete('cascade');
			
		 });
		
		
    }

 

2 odpowiedzi

+2 głosów
odpowiedź 24 września 2020 przez Artek Stary wyjadacz (11,800 p.)

Kolega już najprawdopodobniej podał Ci rozwiązanie. Od siebie dodam, że teraz blade ma nową składnię i możesz pisać mniej więcej tak 

<x-layout>
  <p>
    some content
</p>

</x-layout>

Edit : Sugerowałbym też korzystanie z laravelowego tłumacza w postaci __('something_to_translate')

+1 głos
odpowiedź 24 września 2020 przez olekjs Gaduła (4,540 p.)

Zobacz, czy Twój model Post ma atrybut fillable, czyli odpowiedniki nazw kolumn w bazie danych, zapisane w postaci tablicy.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
        'user_id',
        'title',
        'content',
    ];
}

Wtedy w kontrolerze tworząc post możesz przekazać wszystkie wartości inputów i Laravel sam załapie, które dodać do bazy, właśnie dzięki atrybutowi fillable. Z tym że musiałbyś tam przekazać user_id, a nigdzie nie widzę takiego pola w widoku.

Możesz to zrobić tak:

@extends('layout')
 
@section('content')
 
   <form action="{{ route('posts.store') }}" method="post">
   @csrf
 
    @if ($errors->any())
            @foreach ($errors->all() as $error)
                <div class="btn btn-danger">{{ $error }}</div>
            @endforeach
    @endif
    <input type="hidden" name="user_id" class="form-control" value="{{ auth()->user()->id }}">
    <div class="form-group">
        <label for="title">Tytuł posta:</label>
        <input type="text" name="title" class="form-control">
    </div>
 
    <div class="form-group">
         <label for="content">Treść posta:</label>
        <textarea rows="7" name="content" class="form-control"></textarea>
    </div>
 
    <div class="form-group">
       <button type="submit" value="Zapisz" class="btn btn-primary">Dodaj post</button>
       <span class="btn btn-dark">
        <a href="javascript:history.back()" >Powrót</a>
        </span>
    </div>
 
    </form>
 
@endsection

Ale zalecałbym dodać user_id w kontrolerze, czyli tak:

Posts::create([
     'user_id' => auth()->user()->id,
     'title'   => $request->input('title'),
     'content' => $request->input('content'),
]);

return redirect()->route('posts.index');

 

Podobne pytania

+1 głos
2 odpowiedzi 160 wizyt
pytanie zadane 8 lutego 2018 w PHP przez Kazuhiro Użytkownik (910 p.)
0 głosów
1 odpowiedź 1,508 wizyt
pytanie zadane 29 lipca 2016 w SQL, bazy danych przez GaCeL Dyskutant (7,500 p.)
0 głosów
1 odpowiedź 295 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...