Laravel Ошибка связи между двумя таблицами после отправки первого сообщения - PullRequest
0 голосов
/ 28 мая 2020

Модель сообщения:

class Post extends Model
{
    protected $fillable = [
        'name',
        'image',
        'genders_id',
        'categories_id',
        'sizes_id',
        'price'
    ];

    public function category()
    {
        return $this->hasOne(Category::class, 'id');
    }

    public function gender()
    {
        return $this->hasOne(Gender::class, 'id');
    }

    public function size()
    {
        return $this->hasOne(Size::class, 'id');
    }
}

index.blade. php:

@foreach ($posts as $post)
    <td><img src="{{ url('storage/'. $post->image) }}" width="100" height="50"></td>
    <td>{{ $post->name }}</td>
    <td>{{ $post->size->name }}</td>
    <td>{{ $post->category->name }}</td>
    <td>{{ $post->gender->name }}</td>
    <td>{{ $post->price }} $</td>
    <td></td>
    </tbody>
@endforeach

Таблица сообщений:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('genders_id');
        $table->string('sizes_id');
        $table->string('categories_id');
        $table->integer('price');
        $table->string('image');
        $table->timestamps();
    });
}

PostsController:

public function store(PostValidation $request)
{
    $image = $request->file('image')->store('image');

    Post::create([
        'name' => $request->name,
        'image' => $image,
        'genders_id' => $request->gender,
        'categories_id' => $request->categories,
        'sizes_id' => $request->size,
        'price' => $request->price
    ]);

    return redirect(route('post.index'));
}

Проблема в том, что {{ $post->size->name }} {{ $post->gender->name }} {{ $post->category->name }} работает после моего первого сообщения, всякий раз, когда я добавляю второй пост, он выдает следующую ошибку:

Попытка получить свойство ' name 'не-объекта (View: C: \ xampp \ htdocs \ PracticeOnly \ resources \ views \ posts \ index.blade. php) {{$ post-> size-> name}}

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Попробуйте обновить свою модель, как показано ниже, вы перепутали порядок параметров в hasOne():

class Post extends Model
{
    protected $fillable = [
        'name',
        'image',
        'genders_id',
        'categories_id',
        'sizes_id',
        'price'
    ];

    public function category()
    {
        return $this->hasOne(Category::class,'categories_id');
    }

    public function gender()
    {
        return $this->hasOne(Gender::class,'genders_id');
    }

    public function size()
    {
        return $this->hasOne(Size::class,'sizes_id');
    }
}

Стандартная схема именования для отношения 1 ко многим - это имена столбцов в единственном числе:

        'genders_id' => 'gender_id'
        'categories_id' => 'category_id'
        'sizes_id' => 'size_id'
0 голосов
/ 28 мая 2020

Запустите php artisan tinker найдите свою публикацию через $post = Post::find({{id}}), а затем попробуйте получить доступ к ее свойству размера через $size = $post->size.

Вы должны получить null, т.е. ваши отношения между моделями Post / Size никогда не были .

Как только это будет подтверждено, запустите $post->size_id, чтобы проверить, было ли это вообще установлено в запросе, если нет, вы не передаете свойство size в своем запросе должным образом.

В противном случае я предлагаю вам проверить, соответствуют ли внешние ключи в ваших отношениях вашим именам таблиц (особенно в size), вы могли перезаписать имя таблицы в модели, используя свойство $table в классе Size.

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