Невозможно добавить имя пользователя к автору сообщения - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь вставить имя пользователя для автора из таблицы пользователей в таблицу сообщений, но это не позволяет мне.Я использую рюкзак для своего CRUD, и я не уверен, что я делаю неправильно.Я также не уверен, почему идентификатор появляется для имени пользователя, а не самого имени пользователя, так как правильные имена пользователей отображаются в поле выбора.Я получаю следующую ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (idf. posts, CONSTRAINT posts_author_foreign ИНОСТРАННЫЙ КЛЮЧ (author) ССЫЛКИ users (username)) (SQL: вставить в значения posts (title, content, author, updated_at, created_at) (aasdasd,

asdasda

, 1, 2018-12-24 04:25:23, 2018-12-24 04:25:23))

Я использую SQL 8, Laravel 5.7 и PHP 7.1.19.До сих пор я пытался очистить кеш с помощью команды artisan и выполнил миграцию: обновить (это нормально, потому что у меня нет законных данных).

В App \ Models \ Post:

protected $table = 'posts';
protected $primaryKey = 'id';
protected $foreignKey = 'author';
public $timestamps = true;
protected $guarded = ['id'];
protected $fillable = [
    'title', 'content', 'author'
];
protected $hidden = [];
protected $dates = [];

public function user()
{
    return $this->hasOne('App\Models\User');
}

Создание таблицы сообщений:

Schema::create('posts', function (Blueprint $table) {
        $table->increments('id')->unique();
        $table->string('title')->required();
        $table->longtext('content')->required();
        $table->string('author');
        $table->foreign('author')->references('username')->on('users');
        $table->timestamps();
    });

Выбрать поле на PostCrudController:

$this->crud->addField([
        'label' => "Author",
        'type' => 'select2',
        'name' => 'author', // the db column for the foreign key
        'entity' => 'user', // the method that defines the relationship in your Model
        'attribute' => 'username', // foreign key attribute that is shown to user
        'model' => "App\Models\User", // foreign key model
        'options'   => (function ($query) { //limit to only admins
            return $query->orderBy('username', 'ASC')->where('admin', 1)->get();
        }), 
    ]); 

В общем, мне просто нужно разрешить имя пользователя из выпадающего спискадля вставки в столбец автора, который будет именем пользователя для самого пользователя.

1 Ответ

0 голосов
/ 24 декабря 2018

Из вашей проблемы я понял, что вы пытаетесь добавить связь между таблицей сообщений и пользователями.Таким образом, с моей точки зрения, вместо использования внешней миграции, такой как

$table->foreign('author')->references('username')->on('users');

, вы должны сделать внешний ключ следующим образом:

$table->unsignedInteger('user_id')
$table->foreign('user_id')
    ->references('id')
    ->on('users')
    ->onUpdate('CASCADE')
    ->onDelete('CASCADE');

И затем вы можете передать идентификатор пользователя встолбец user_id для установления взаимосвязи между этими двумя.

Преимущества использования внешнего ключа, подобного этому, заключаются в том, что столбец id является первичным ключом в таблице пользователей, поэтому он однозначно идентифицирует вашего пользователя и представляет собой целое число без знака.так что движку SQL будет легко проиндексировать это.

Теперь для сбора ваших данных вы можете определенно выразить следующее красноречивое отношение в вашей модели Post

public function user() {
    return $this->belongsTo('App/User');
}

И при загрузке сообщений вы можетеиспользуйте готовую загрузку (с помощью () eloquent метода) что-то вроде

$posts = Post:::with('user)->get();

Теперь со всеми сообщениями вы можете получить доступ к любой связанной пользовательской информации, например:

forach ($posts as $post){
    $userName = $post->user->name;
}

Надеюсь, это поможет.

...