我是关系数据库的新手,目前我正在运行一个本地sqlite数据库,只是尝试建立一个数据透视/关系数据库,在其中可以使用参与者的电话号码作为主键来获取参与者的消息列表。没有登录,登录基本上是由用户通过将短信从他们的手机发送到应用程序来完成的,因此我无法在估算中使用典型的“ id”列。在我的数据库中,participant_id也可能是电话号码。我不确定自己在做什么错。
在我的控制器中,当我访问预定义的路线时,我只是尝试使用以下代码来DD结果:
public function showMessages()
{
$participant_id = "+5555555";
//$activeParticipant = Participant::where('participant_id', $participant_id);
$activeParticipant = Participant::find($participant_id);
$messages = $activeParticipant->messages;
dd($messages);
//$messages = Participant::find($participant_id)->messages;
}
我收到以下错误:
SQLSTATE[HY000]: General error: 1 no such column: participants.id (SQL: select * from "participants" where "participants"."id" = +5555555 limit 1)
尽管存在此错误,但我很确定我有问题,并且我根本不理解下面的代码中的操作...如果有人可以帮助我解释一下,我将不胜感激。
这是我的模型和数据库迁移: 参与者迁移:
class CreateParticipantsTable extends Migration
{
protected $primaryKey = 'participant_id';
protected $incrementing = false;
public function up()
{
Schema::create('participants', function (Blueprint $table) {
$table->string('participant_id')->unique()->primary();
$table->date('appointment_date')->nullable();
$table->boolean('subscribed');
$table->timestamps();
});
}
参与者模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Participant extends Model
{
protected $table = 'participants';
protected $fillable = ['participant_id', 'appointment_date', 'subscribed'];
public function messages()
{
return $this->hasMany(Message::class);
// return $this->hasMany('App\Message', 'message_id', 'participant_id');
}
public function notifications()
{
return $this->hasMany(Notification::class);
}
}
消息迁移:
class CreateMessagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');
$table->integer('message_id')->unsigned();
$table->string('phoneNumber')->nullable();
$table->string('message_content')->nullable();
$table->string('mediaSID')->index()->nullable();
$table->string('messageSID')->index()->nullable();
$table->string('mediaURL')->index()->nullable();
$table->binary('media')->nullable();
$table->string('filename')->index()->nullable();
$table->string('MIMEType')->nullable();
$table->timestamps();
$table->foreign('message_id')->references('participant_id')->on('participants')->onDelete('cascade');
});
}
消息模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
protected $table = 'messages';
protected $hidden = 'media';
protected $fillable = ['message_id', 'phoneNumber', 'message_content', 'mediaSID', 'messageSID', 'mediaURL', 'media', 'filename', 'MIMEType'];
public function participant()
{
return $this->belongsTo(Participant::class);
}
}
答案 0 :(得分:2)
Laravel尝试从名称中猜测出模型的主键。因此,在致电时:
$activeParticipant = Participant::find($participant_id);
Laravel呼叫SELECT * FROM participants WHERE participants.id = ? ...
,由于该列不存在,该错误返回participants.id
的问题。
由于您使用的是自定义主键,因此需要对其进行定义。在您的Participant
模型上,在类声明附近添加以下内容:
protected $primaryKey = "participant_id";
设置后,默认查询逻辑将调整为SELECT * FROM participants WHERE participants.participant_id = ? ...
,并且所有内容都应为金色。
注意:Participant
与其他模型之间的任何关系都可能有类似的问题。 Laravel再次尝试猜测要用于->hasMany()
,->belongsTo()
等的列,因此请仔细检查Documentation for Relationships,尤其是这些方法上可用的其他参数。
编辑:
//$activeParticipant = Participant::where('participant_id', $participant_id);
如果您在其末尾添加了->first()
以实际执行查询,那将是可行的。如果没有Closure
(->first()
,->get()
,->paginate()
等),则您有一个Builder
实例,而不是实际的数据库结果(null
,Collection
或Participant
)