Laravel Eloquent отношения один ко многим не работает - PullRequest
2 голосов
/ 01 октября 2019

Я явно что-то упускаю. Я думал, что мне комфортно в отношениях Laravel ...

У меня есть 2 таблицы с именами рейтингов и рейтинговых деталей. Модели называются Rating & Ratingdetail:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Rating extends Model
{
    public function ratingdetails()
    {
        return $this->hasMany('App\Ratingdetail');
    }
    public function campaigns()
    {
        return $this->hasMany('App\Campaign');
    }
}

и

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Spatie\Translatable\HasTranslations;

class Ratingdetail extends Model
{
    use HasTranslations;
    public $translatable = ['value'];

    public function rating()
    {
        return $this->belongsTo('App\Rating');
    }
}

Когда я пытаюсь получить доступ к своей модели рейтинга, она работает нормально, но я не могу получить доступ к отношениям;результат следующий, несмотря на то, что должно быть 4 строки Ratingdetails ...:

{"id":1,"description":"fontawesome","created_at":null,"updated_at":null,"deleted_at":null}

Спасибо всем за потраченное время!

Ответы [ 2 ]

2 голосов
/ 01 октября 2019
$rating = Rating::find($request->rating_id);
return $rating->toJson();

В приведенной выше строке кода вы никогда не получите доступ к соотношению ratingdetails. Они не включены по умолчанию и должны быть загружены до того, как станут доступными:

$rating = Rating::with(["ratingdetails"])->find($request->rating_id);
return $rating->toJson();

Включение через with() приведет к «загрузке» отношения и предоставит доступ к нему через

console.log(rating.ratingdetails);
// Will contain an array of 4 objects

Перед преобразованием в json вы сможете получить доступ к $rating->ratingdetails, но после преобразования вы потеряете доступ , если только вы ранее не загрузили отношение .

0 голосов
/ 01 октября 2019

На самом деле я не могу ответить на этот вопрос, не имея $ fillable атрибутов Models или без структур таблиц БД. Но я думаю, что в ваших таблицах есть следующие столбцы:

"raitings" -> "id", "description", "creation_at", "updated_at", "dele_at"

"raitingdetails" ->"id", "raiting_id", "value", ...

Как правило, вам необходимо создать отношение OneToMany для этих двух таблиц с внешним ключом. Так что в вашей миграции "raitingdetails" у вас должно быть что-то вроде этого:

$table->unsignedBigInteger('raiting_id')->nullable();
$table->foreign('raiting_id')->references('id')->on('raitings')->onUpdate('cascade')->onDelete('cascade');

Ваши модели верны, но это не просто круто сейчас. Вы можете улучшить их, добавив $заполняемые столбцы и FK отношений (Примечание: если вы используете традиционную концепцию внешнего ключа, такую ​​как «partents.id» -> «childs.partent_id», то вы также можете оставить эту часть).

  1. Чтобы получить все детали рейтинга 1 рейтинга, вы можете сделать это:
$rating = Rating::find($rating_id);
$rating_details_of_one = $rating->ratingdetails()->get()->toJson();
Если вы хотите иметь подробности рейтинга для всех действий, вы можете добавить Accessor в свою модель рейтинга и добавить его к $, добавляется следующим образом:
protected $appends = [ 'rating_details' ]; public function
public function getRatingDetailsAttribute() {
    return $this->ratingdetails;
}

Ив логических частях вы можете получить доступ следующим образом:

$ratings = Rating::find($rating_id); // this will get with their "ratingdetails" relation

Или вы можете прикрепить аксессор на лету без защищенных $ append и получить функцию getRatingDetailsAttribute () следующим образом:

$rating = Rating::find($rating_id);
$rating_details_of_one = $rating->setAppends([ 'rating_details' ])->get()->toJSON();
Если вы хотите иметь некоторые рейтинги с их деталями, вы можете использовать что-то вроде этого:
$rating_details_of_many = Rating::where('description', 'fontawesome')->with('ratingdetails')->get()->toJson();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...