Not being relationships in laravel 5 db:seed - laravel

I have three model Developer model:
migration:
$table->increments('id');
$table->string('email')->unique();
$table->unsignedInteger('programming_language_id');
$table->unsignedInteger('language_id');
$table->timestamps();
and function
class Developer extends Model
{
public function programming_languages() {
return $this->hasMany('App\ProgrammingLanguage');
}
public function languages() {
return $this->hasMany('App\Language');
}
}
ProgrammingLanguage model:migration:
$table->increments('id');
$table->string('name')->unique();
$table->timestamps();
and function:
protected $table = 'programming_languages';
public function developers() {
return $this->belongsToMany('App\Developer');
}
Language model: migration:
$table->increments('id');
$table->string('code', 30)->unique();
$table->timestamps();
and function:
public function developers() {
return $this->belongsToMany('App\Developer');
}
I want to make db seeder and being relationships between those. How can i do that?
I am trying: creating a factory DeveloperFactory
$factory->define(App\Developer::class, function (Faker $faker) {
return [
'email' => $faker->unique()->safeEmail,
'programming_language_id' => function () {
return factory(App\ProgrammingLanguage::class)->create()->id;
},
'language_id' => function () {
return factory(App\Language::class)->create()->id;
}
];
});
seed OK, But it doesnot make any relationships. just seed the data.How can i do that by db:seed?

Seed your languages and programming languages tables first, then query for records in the developer seeder.
return [
'email' => $faker->unique()->safeEmail,
'programming_language_id' => App\ProgrammingLanguage::inRandomOrder()->first()->getKey(),
'language_id' => App\Language::inRandomOrder()->first()->getKey()
];

Related

Laravel not setting the provided foreignID

I am currently trying to save a customer and using a hasMany Eloquent-Relationship to store addresses with it in a seperate table. Now i ran into the problem, that laravel is storing every value right in both tables except the foreignID. Here are some code snippets which I am using. The request returns to success, although the supplier_id (foreignKey) in the supplier_addresses table is not set.
Supplier Migration:
Schema::create('suppliers', function (Blueprint $table) {
$table->string('supplier_id')->primary();
$table->string('supplierName');
$table->string('taxNumber');
$table->timestamps();
});
SupplierAddresses Migration:
Schema::create('supplier_addresses', function (Blueprint $table) {
$table->id();
$table->string('supplier_id');
$table->string('street');
$table->string('houseNumber');
$table->string('stairway')->nullable();
$table->string('floor')->nullable();
$table->string('door')->nullable();
$table->string('zipCode');
$table->string('city');
$table->string('type');
$table->timestamps();
});
Supplier Model:
class Supplier extends Model
{
use HasFactory;
protected $primaryKey = 'supplier_id';
protected $keyType = 'string';
public $incrementing = 'false';
protected $guarded = [];
protected $fillable = [
'supplier_id',
'supplierName',
'taxNumber'
];
public function address() {
return $this->hasMany(SupplierAddress::class, "supplier_id");
}
}
SupplierAddresses Model:
class SupplierAddress extends Model
{
use HasFactory;
protected $fillable = [
'street',
'houseNumber',
'stairway',
'floor',
'door',
'zipCode',
'city',
'type',
'supplier_id'
];
}
Suppliers Controller:
class SuppliersController extends Controller
{
public function show() {
return view('addSupplier');
}
public function submit() {
request()->validate([
'supplier_id' => 'required',
'supplierName' => 'required',
'taxNumber' => 'required'
]);
$supplier = Supplier::create([
'supplier_id' => request('supplier_id'),
'supplierName' => request('supplierName'),
'taxNumber' => request('taxNumber')
]);
$supplier->address()->create([
'supplier_id' => request('supplier_id'),
'street' => request('street'),
'houseNumber' => request('houseNumber'),
'stairway' => request('stairway'),
'floor' => request('floor'),
'door' => request('door'),
'zipCode' => request('zipCode'),
'city' => request('city'),
'type' => 'P'
]);
return redirect()->back()->with('success', 'Das Anlegen eines neuen Lieferanten war erfolgreich.');
}
}
Suppliers Table:
SupplierAddresses Table:
You need to assign foreign key constrained between suppliers and supplier_addresses table
example
primary key
Schema::create('suppliers', function (Blueprint $table) {
$table->id();
$table->string('supplier_id');
$table->timestamps();
});
foregin key
Schema::table('supplier_addresses', function (Blueprint $table) {
$table->unsignedBigInteger('supplier_id');
$table->foreign('supplier_id')->references('id')->on('suppliers');
});
Or
Schema::table('supplier_addresses', function (Blueprint $table) {
$table->foreignId('supplier_id')->constrained('suppliers');
});
for more details you can see this https://laravel.com/docs/9.x/migrations#foreign-key-constraints

Laravel 8 many to many relationshiop update/delete API (pivot table)

Hello I need a help with laravel 8 many to many relationship pivot table, when I updating or deleting data in API.
These are my files info.
Firstly I created two tables:
Companies (migration file)
public function up()
{
Schema::create('companies', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamps();
});
}
Contacts (migration file)
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamps();
});
}
After this created pivot table company_contact (migration file)
public function up()
{
Schema::create('company_contact', function (Blueprint $table) {
$table->foreignId('company_id')->constrained();
$table->foreignId('contact_id')->constrained();
});
}
Models looks like this:
Company model
class Company extends Model{
use HasFactory;
protected $fillable = [
'name',
'email'
];
public function contacts()
{
return $this->belongsToMany(Contact::class);
}
}
Contact model
class Company extends Model{
use HasFactory;
protected $fillable = [
'name',
'email'
];
public function contacts()
{
return $this->belongsToMany(Contact::class);
}
}
My routes file
Route::apiResource('companies', CompanyController::class);
My company controller
class CompanyController extends Controller{
public function index()
{
return CompanyResource::collection(Company::all());
}
public function store(CompanyStoreRequest $request)
{
$company = Company::create($request->validated());
$company->contacts()->attach($request->input('contact_id'));
return new CompanyResource($company);
}
public function show(Company $company)
{
//
}
public function update(CompanyStoreRequest $request,Company $company)
{
$contacts = Company::where('id', $company->id)->contacts()->get();
$company->contacts()->sync($request->input(['contact_id']));
$company->update($request->validated());
return new CompanyResource($company);
}
public function destroy(Company $company)
{
}
}
Company store request
public function rules()
{
return [
'name' => ['required'],
'email' => ['required', 'email'],
'contact_id' =>['required']
];
}
company resource
public function toArray($request)
{
//return parent::toArray($request);
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'contact_count' => $this->contacts()->count()
];
}
Maybe somebody can help my to write correct store() and destroy() methods in to company controller. For example when I updating company data also I want to add more contacts and to save these contacts id's in the pivot table.
With destroy method, when I delete certain company, also I want automatically delete these id’s in pivot table (relation company with contacts).
Thanks for any help.
First, you can pass the data of the contacts in an array together with the company's, using an array for several contacts and to record with the relationship use a foreach with the attach method, search on it. About the deletion you can use the softDelete, search on it too, it makes the cascade deletion of the items.

In Laravel many-to-many relationship, is there a way to update data in a pivot table?

I built two models User and Institution.
How do I update the pivot data between them, after adding additional Pivot columns?
<?php
class User extends Authenticatable
{
public function institutions()
{
$pivots = ['id', 'program_choice', 'session'];
return $this->belongsToMany('App\Institution')
->withPivot($pivots);
}
}
class Institution extends Authenticatable
{
public function users()
{
$pivots = ['id', 'program_choice', 'session'];
return $this->belongsToMany('App\User', 'institution_user')
->withPivot($pivots);;
}
}
Here are the migrations
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->integer('user_id')->unsigned();
$table->rememberToken();
$table->timestamps();
});
}
class CreateInstitutionsTable extends Migration
{
public function up()
{
Schema::create('institutions', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->unique();
$table->string('city')->nullable();
$table->string('state')->nullable();
$table->string('country')->nullable();
$table->string('address')->nullable();
$table->string('user_id')->nullable();
$table->string('postal_code')->nullable();
$table->timestamps();
});
}
}
This is the what the pivot table looks like
I am able to attach the information to the pivot table
public function storeInstitution(Request $request)
{
$user_id = auth()->user()->id;
$user = User::find($user_id);
$institution_id = $request->input('institution_id');
$user_program_choice = $request->input('program_choice');
$user_session = $request->input('session');
$user_inst = array(
'program_choice' => $user_program_choice,
'session' => $user_session,
'user_id' => $user_id,
'institution_id' => $institution_id
);
$user->institutions()->attach($institution_id, $user_inst);
return 'success';
}
But unable to update the attached pivot E.g I can't change the program_choice, particle physics to something like digital art
Here's my current code
public function updateInstitutions(Request $request, $pivot_id)#TODO id is pivot_id
{
$user_id = auth()->user()->id;
$user = User::find($user_id);
$institution_id = $request->input('institution_id');
$pivot_attributes = array(
'user_id' => $user_id,
'institution_id' => $institution_id,
'session' => $request->input('session'),
'program_choice' => $request->input('program_choice'),
);
$user->institutions()->updateExistingPivots($institution_id, $pivot_attributes, false);
return 'success';
}
How do I update my pivot data, using the pivot id?
Check the documentation regarding this aspect.
Updating A Record On A Pivot Table
If you need to update an existing row in your pivot table, you may use
updateExistingPivot method. This method accepts the pivot record
foreign key and an array of attributes to update:
$user = App\Models\User::find(1);
$user->roles()->updateExistingPivot($roleId, $attributes);

create a post with pre-defined categories

I have a table for posts and a table for categories. But its not possible to create new categories they should already exist in the database and is not possible to change them. DO you know how to structure this logic properly on laravel?
Also when a post is created it should have a maximum of 3 categories and a published date. Do you know how to do that validation in laravel, of dates and the maximum of 3 categories when a post is created? I have this validation for now:
$this->validate($request, [
‘post_name’ => 'required|max:255',
‘post_categories’ => 'required',
‘post_date' => 'required',
]);
Relevant code for this context:
// Category Model:
class Category extends Model
{
public function posts(){
return $this->belongsToMany('App\Post’);
}
}
// Post model
class Post extends Model
{
public function categories(){
return $this->belongsToMany('App\Category');
}
}
Migration Post:
class CreatePost extends Migration
{
public function up()
{
Schema::create(‘posts’, function (Blueprint $table) {
$table->increments('id');
$table->string(‘name’);
…
$table->timestamps();
});
}
Migration Category:
<?php
class CreateCategoriesTable extends Migration
{
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
}
// post controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
}
public function create()
{
return view(‘app.createPost’);
}
public function store(Request $request)
{
dd($request->all());
$this->validate($request, [
‘post_name’ => 'required|max:255',
‘post_categories’ => 'required',
‘post_date' => 'required',
]);
}
Use between rule
'post_categories' => 'required|array|between:1,3'
And for the first question, use firstOrCreate
foreach($request->post_categories as $categoryName){
$category= App\Category::firstOrCreate(['name' => $categoryName]);
$post->categories->attach($category->id);
}

Laravel - Many to many not pulling back results

I have a User class with the following:
public function school()
{
return $this->belongsToMany('School');
}
I have a School class with the following:
public function user()
{
return $this->belongsToMany('User');
}
I create my pivot table use the pivot generator, here is the migrate for it:
public function up()
{
Schema::create('school_user', function(Blueprint $table) {
$table->increments('id');
$table->integer('school_id')->unsigned()->index();
$table->foreign('school_id')->references('id')->on('schools')->onDelete('cascade');
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->boolean('admin');
$table->timestamps();
});
}
There is only one item in the user table, the school table, and the pivot table. When I do
$user = User::where('email', '=', Input::get('email'))->first();
$schools = $user->schools;
return Response::json([
'success' => true,
'user' => $user->toArray(),
'schools' => $schools
]);
It returns a null for the schools. Am I missing something?
You have declared:
public function school()
{
return $this->belongsToMany('School');
}
But using $user->schools, you should change the function declaration to schools:
public function schools()
{
//...
}
Also make sure that, you are using the right relationship, I'm confussed because one user may belongs to only one school (logically).

Resources