• 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

Object Storage Arubacloud
0 głosów
97 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 163 wizyt
pytanie zadane 8 lutego 2018 w PHP przez Kazuhiro Użytkownik (910 p.)
0 głosów
1 odpowiedź 1,518 wizyt
pytanie zadane 29 lipca 2016 w SQL, bazy danych przez GaCeL Dyskutant (7,500 p.)
0 głosów
1 odpowiedź 313 wizyt

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...